多執行緒簡介
執行緒(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有乙個...