Python學習隨筆(九)

S L N發表於2020-11-04

Python學習隨筆(九)

直接看 參考

多執行緒
執行緒:是cpu最小排程單位,一個程式中至少有一個或者多個執行緒
import threading
t = threading.Thread(target=函式名, name=執行緒名, args=函式的引數元組,kwargs=函式的引數字典) 建立並初始化執行緒
t.start() 啟動執行緒
t.join() 阻塞函式,直到執行緒結束為止
t.getName() 返回執行緒名
t.setName() 設定執行緒名
t.setDaemon(False) 設定為後臺執行緒,預設是False,預設主執行緒會等待所有子執行緒結束之後才會結束,主執行緒結束意味著程式退出;如果設定為True,主執行緒則不會等待子執行緒,主執行緒結束,子執行緒自動結束
t.isAlive() 返回執行緒是否活動的
t.enumerate() 返回一個包含正在執行的執行緒的list
t.activeCount() 返回正在執行的執行緒數量,與len(threading.enumerate())有相同的結果;

執行緒互斥鎖Lock
import threading
mutex = threading.Lock() 建立互斥鎖
mutex.acquire() 鎖定資源
mutex.release() 釋放資源
互斥鎖Lock主要針對多個執行緒同時操作同一個資料,使用互斥鎖可以保證資料正常修改或者訪問。

執行緒事件Event
import threading
eEvent = threading.Event() 建立event事件
eEvent.set() 全域性內建標誌Flag,將標誌Flag 設定為 True,通知在等待狀態(wait)的執行緒恢復執行
eEvent.isSet() 獲取標誌Flag當前狀態,返回True 或者 False
eEvent.wait() 一旦呼叫,執行緒將會處於阻塞狀態,直到等待其他執行緒呼叫set()函式恢復執行
eEvent.clear() 將標誌設定為False
事件event中有一個全域性內建標誌Flag,值為 True 或者False。使用wait()函式的執行緒會處於阻塞狀態,此時Flag指為False,直到有其他執行緒呼叫set()函式讓全域性標誌Flag置為True,其阻塞的執行緒立刻恢復執行,還可以用isSet()函式檢查當前的Flag狀態.
事件Event主要用於喚醒正在阻塞等待狀態的執行緒。

執行緒定時器Timer
指定時間間隔後啟動執行緒
import threading
timer = threading.Timer(interval, function, args=None, kwargs=None)
interval — 定時器間隔,間隔多少秒之後啟動定時器任務(單位:秒);
function — 執行緒函式;
args — 執行緒引數,可以傳遞元組型別資料,預設為空(預設引數);
kwargs — 執行緒引數,可以傳遞字典型別資料,預設為空(預設引數);

執行緒訊號量semaphore
semaphore訊號量可以通過內建計數器來控制同時執行執行緒的數量,啟動執行緒(消耗訊號量)內建計數器會自動減一,執行緒結束(釋放訊號量)內建計數器會自動加一;內建計數器為零,啟動執行緒會阻塞,直到有本執行緒結束或者其他執行緒結束為止;
semaphore = threading.Semaphore(n) 新增一個計數器,最大併發執行緒數量n(最多同時執行n個執行緒)
semaphore.acquire() 消耗訊號量,內建計數器減一
semaphore.release() 釋放訊號量,內建計數器加一

執行緒障礙物件Barrier
barrier = threading.Barrier(parties, action=None, timeout=None)
parties — 執行緒計數器,記錄執行緒數量,也稱執行緒障礙數量;
action — 是一個可呼叫函式,當等待的執行緒到達了執行緒障礙數量parties,其中一個執行緒會首先呼叫action 對應函式,之後再執行執行緒自己內部的程式碼;
timeout — 預設的超時時間;

執行緒條件變數Condition
con = threading.Condition() 建立條件變數condition
con.acquire() 條件變數condition 執行緒上鎖
con.wait() 執行緒掛起(阻塞狀態)
con.notify(n) 喚醒正在等待(wait)的n個執行緒
con.notifyAll() — 如果wait狀態執行緒比較多,notifyAll的作用就是通知所有執行緒
con.release() 條件變數condition 執行緒釋放鎖

執行緒佇列
import queue
執行緒佇列Queue — FIFO(先進先出佇列),即哪個資料先存入,取資料的時候先取哪個資料
q = queue.Queue()
執行緒佇列LifoQueue — LIFO(先進後出佇列),即哪個資料最後存入的,取資料的時候先取
q=queue.LifoQueue()
執行緒佇列PriorityQueue — PriorityQueue(優先順序佇列),即存入資料時候加入一個優先順序,取資料的時候優先順序最高的取出
q = queue.PriorityQueue()

執行緒池ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=n) 執行緒池中最多能同時執行的執行緒數目為n
task = executor.submit(func, args ) 使用非阻塞方式呼叫func,args為傳遞給func的引數列表
task.done() 判斷該任務是否結束
task.cancel() 取消提交的任務,如果任務已經線上程池中執行了,則不能取消
task.result() 獲取task的執行結果
as_completed(executor.submit(func, args )) 是一個生成器,一次取出所有任務的結果
executor.map((func, args) 保證任務的順序性
wait(all_task , return_when=ALL_COMPLETED 接收3個引數,等待的任務序列、超時時間以及等待條件。等待條件return_when預設為ALL_COMPLETED,表明要等待所有的任務都結束。等待條件可以設定為FIRST_COMPLETED,表示第一個任務完成就停止等待。

相關文章