python3 多執行緒

2022-06-12 19:51:16 字數 3148 閱讀 5197

多執行緒簡介

執行緒(thread)也稱輕量級程序,時作業系統能夠進行運算排程的最小單位,它被包涵在程序之中,時程序中的實際運作單位。執行緒自身不擁有資源,只擁有一些在執行中必不可少的資源,但他可與同屬乙個程序的其他執行緒共享程序所擁有的全部資源。乙個執行緒可以建立和撤銷另乙個執行緒,同一程序中的多個執行緒之間可以併發執行。

執行緒有就緒/阻塞/執行三種基本狀態:

1/ 就緒狀態是指執行緒具備執行的所有條件,邏輯上可以執行,在等待處理機

2 / 執行狀態是指執行緒占有處理機正在執行。

3/ 阻塞狀態是指執行緒在等待乙個事件(如某個訊號量),邏輯上不可執行

結論:在python中,對於計算密集型任務,多程序佔優勢;對於i/o密集型任務,多執行緒佔優勢

python多執行緒其它介紹

1/1 多執行緒threading模組

方法一 建立threading.thread類的例項,呼叫其start()方法

方法二 繼承thread類,在子類中重寫run()和init()方法

1/2 多執行緒同步lock(互訴鎖)

#如果多個執行緒共同對某個資料修改,則可能出現不可預料的結果,這個時候就需要使用互訴鎖來進行同步

#呼叫鎖

lock = threading.lock()

#獲取鎖,使用者執行緒同步

lock.acquire()

1/3 多執行緒同步semaphore(訊號量)

互訴鎖是只允許乙個執行緒訪問共享資料,而訊號量是同時允許一定數量的執行緒訪問共享資料

semaphore = threading.boundedsemaphore()

練習:import threading

import time

semaphore = threading.boundedsemaphore(5)

def yewubanli(name):

semaphore.acquire()

time.sleep(3)

print(f" 正在辦理業務")

semaphore.release()

for thread in thread_list:

thread.start()

for thread in thread_list:

thread.join()

1/4 多執行緒同步condition

條件物件condition能讓乙個執行緒a停下來,等待其它執行緒b,執行緒b滿足了某個條件後通知(notify)執行緒a繼續執行。執行緒首先獲取乙個條件變數鎖,如果條件不足,則該執行緒等待(wait)並釋放條件變數鎖;如果條件滿足,就繼續執行執行緒,執行完成後可以通知(notify)其它狀態為wait的執行緒執行。其它處於wait狀態的執行緒接到通知後會重新判斷條件以確定是否繼續執行。

cond = threading.condition()

1/5 多執行緒同步event

事件用於執行緒之間的通訊。乙個執行緒發出乙個訊號,其它乙個或多個執行緒等待,呼叫event物件的wait方法,執行緒則會阻塞等待,直到別的執行緒set之後才會被喚醒

cond = threading.event()

1/6 執行緒優先順序佇列(queue)

python的queue模組中提供了同步的/執行緒安全的佇列類,包括先進先出佇列queue/後進後出佇列lifoqueue和優先順序佇列priorityqueue。這些佇列都實現了鎖原語,可以直接使用來實現執行緒之間的同步。

練習:import threading, time

import queue

q = queue.queue(maxsize=5)

def producera():

count = 1

while true:

q.put(f"冷飲 ")

print(f" a 放入:[冷飲 ]")

count += 1

time.sleep(1)

def consumerb():

while true:

print(f" b 取出 ")

time.sleep(5)

p = threading.thread(target=producera)

c = threading.thread(target=consumerb)

c.start()

p.start()

1/7 多執行緒之執行緒池pool

在物件導向程式設計中,建立和銷毀物件是很費時間的,因為建立乙個物件要獲取記憶體資源或其它更多資源。虛擬機器也將檢視跟蹤每乙個物件,以便能夠在物件銷毀後進行垃圾**。同樣的道理,多工情況下每次都會生成乙個新執行緒,執行任務後資源再被**就顯得非常低效,因此執行緒池就是解決這個問題的方法。類似的還有連線池/程序池等。

將任務新增到執行緒池中,執行緒池會自動指定乙個空閒的執行緒取執行任務,當超過執行緒池的最大執行緒數時,任務需要等待有新的空閒執行緒後才會被執行。

我們可以使用threading模組及queue模組定製執行緒池,也可以使用multiprocessing。from multiprocessing import pool這樣匯入的pool表示的時程序池,from multiprocessing.dummy import pool這樣匯入的pool表示的時執行緒池

練習:from multiprocessing.dummy import pool as threadpool

import time

def fun(n):

time.sleep(2)

start = time.time()

for i in range(5):

fun(i)

print("單執行緒順序執行耗時:", time.time() - start)

start2 = time.time()

pool = threadpool(processes=5)

results2 = pool.map(fun, range(5))

pool.close()

pool.join()

print("執行緒池(5)併發執行耗時:",time.time() - start2)

總結:python多執行緒適合用再i/o密集型任務中。i/o密集型任務較小時間用再cpu計算上,較多時間用再i/o上,如檔案讀寫/web請求/資料庫請求等;而對於計算密集型任務,應該使用多程序

Python3多執行緒

學習python執行緒 python3 執行緒中常用的兩個模組為 thread threading 推薦使用 thread 模組已被廢棄。使用者可以使用 threading 模組代替。所以,在 python3 中不能再使用 thread 模組。為了相容性,python3 將 thread 重新命名為...

python3 多執行緒,執行緒鎖

python使用多執行緒,不一定執行速度快,這裡引入gil global interpreter lock python直譯器中任意時刻都只有乙個執行緒在執行 gil執行過程 1 設定乙個gil 2 切換執行緒去準備執行任務 runnale就緒狀態 3 執行 4 可能出現的狀態 執行緒任務執行結束 ...

Python3多執行緒程式設計

多執行緒使用,可以讓乙個執行緒訪問某個資源,其他執行緒給他通過queue發任務,這樣避免對共享的資源編寫繁瑣的加鎖解鎖 threading包也提供了 locks,events,condition variables,and semaphores這些工具,可以做多執行緒間的資源共享.python有乙個...