python 多執行緒的實現
多執行緒的實現
併發:多個任務同一時間段進行
並行:多個任務同一時刻進行
執行緒模組
Python通過兩個標準庫_thread 和threading,提供對執行緒的支援 , threading對_thread進行了封裝
因此在實際的使用中我們一般都是使用threading,threading模組中提供了Thread , Lock , RLock ,
Condition等元件
Thread類
常用引數
target 表示呼叫物件,即子執行緒要執行的任務
name 子執行緒的名稱
args 傳入target函式中的位置引數,是一個元組,引數後必須加逗號隔開
常用例項方法
Thread.run (self) 執行緒啟動時執行的方法,由該方法呼叫target引數所指定的函式
Thread.start (self) 啟動程序,start方法就是去幫你呼叫run方法
Thread.terminate (self) 強制終止執行緒
Thread.join (self, timeout=None) 阻塞呼叫,主執行緒進行等待
Thread.setDaemon (self,daemonic) 將子執行緒設定為守護執行緒
Thread.getName(self,name) 獲取執行緒名稱
Thread.setName (self,name ) 設定執行緒名稱
建立執行緒
例項Thread類
繼承Thread類
Join & setDaemon
主執行緒 : 當一個程式啟動時 , 就有一個執行緒開始執行 , 該執行緒通常叫做程式的主執行緒
子執行緒 : 因為程式是開始時就執行的 , 如果你需要再建立執行緒 , 那麼建立的執行緒就是這個主執行緒的子執行緒
主執行緒的重要性體現在兩方面 :
-
是產生其他子執行緒的執行緒
-
通常它必須最後完成執行比如執行各種關閉操作
join : 阻塞呼叫程式 , 直到呼叫join () 方法的執行緒執行結束, 才會繼續往下執行
setDaemon() 與 join() 基本上是相對的 , join會等子執行緒執行完畢 ; 而setDaemon則不會等,主執行緒結束,則全部結束
執行緒通訊
鎖
在多執行緒中 , 所有變數對於所有執行緒都是共享的
因此 , 執行緒之間共享資料最大的危險在於多個執行緒同時修改一個變數 , 那就亂套了
所以我們需要互斥鎖 , 來鎖住資料
執行緒間全域性變數的共享
因為執行緒屬於同一個程序,因此它們之間共享記憶體區域,所以全域性變數是公共的
共享記憶體間存在競爭問題
在這裡進行原子操作(取值、運算、賦值)的時候切換到了其它執行緒,一個執行緒還沒賦值,另外的執行緒就已經給它賦值了,然後又切回來繼續賦值
使用鎖來控制共享資源的訪問
加鎖:Lock物件.acquire()
解鎖:Lock物件.release()
佇列的基本概念
一個入口,一個出口,先入先出(FIFO)
執行緒安全佇列、操作一覽
入隊: put(item)
出隊: get()
測試空: empty()
測試滿: full()
佇列長度: qsize()
任務結束: task_done()
等待完成: join()
執行緒池
池的概念
主執行緒:相當於生產者,只管向執行緒池提交任務,並不關心執行緒池是如何執行任務的,因此,也不關心是哪一個執行緒執行的這個任務
執行緒池:相當於消費者,負責接收任務,並將任務分配到一個空閒的執行緒中去執行
執行緒池的簡單實現
python內建執行緒池
池的其他操作
操作一: close - 關閉提交通道,不允許再提交任務
操作二: terminate - 中止程序池,中止所有任務