1. 程式人生 > 其它 >python 多執行緒的實現

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

主執行緒 : 當一個程式啟動時 , 就有一個執行緒開始執行 , 該執行緒通常叫做程式的主執行緒

子執行緒 : 因為程式是開始時就執行的 , 如果你需要再建立執行緒 , 那麼建立的執行緒就是這個主執行緒的子執行緒

主執行緒的重要性體現在兩方面 :

  1. 是產生其他子執行緒的執行緒

  2. 通常它必須最後完成執行比如執行各種關閉操作

join : 阻塞呼叫程式 , 直到呼叫join () 方法的執行緒執行結束, 才會繼續往下執行

setDaemon() 與 join() 基本上是相對的 , join會等子執行緒執行完畢 ; 而setDaemon則不會等,主執行緒結束,則全部結束


執行緒通訊

在多執行緒中 , 所有變數對於所有執行緒都是共享的

因此 , 執行緒之間共享資料最大的危險在於多個執行緒同時修改一個變數 , 那就亂套了

所以我們需要互斥鎖 , 來鎖住資料

執行緒間全域性變數的共享

因為執行緒屬於同一個程序,因此它們之間共享記憶體區域,所以全域性變數是公共的

共享記憶體間存在競爭問題

在這裡進行原子操作(取值、運算、賦值)的時候切換到了其它執行緒,一個執行緒還沒賦值,另外的執行緒就已經給它賦值了,然後又切回來繼續賦值

使用鎖來控制共享資源的訪問

加鎖:Lock物件.acquire()

解鎖:Lock物件.release()


佇列的基本概念

一個入口,一個出口,先入先出(FIFO)

執行緒安全佇列、操作一覽

入隊: put(item)

出隊: get()

測試空: empty()

測試滿: full()

佇列長度: qsize()

任務結束: task_done()

等待完成: join()



執行緒池

池的概念

主執行緒:相當於生產者,只管向執行緒池提交任務,並不關心執行緒池是如何執行任務的,因此,也不關心是哪一個執行緒執行的這個任務

執行緒池:相當於消費者,負責接收任務,並將任務分配到一個空閒的執行緒中去執行

執行緒池的簡單實現

python內建執行緒池


池的其他操作

操作一: close - 關閉提交通道,不允許再提交任務

操作二: terminate - 中止程序池,中止所有任務