前言
今天,我們就來**一下如何控制線程的觸發執行。
要實現對多個執行緒進行控制,其實本質上就是訊息通訊機制在起作用,利用這個機制傳送指令,告訴執行緒,什麼時候可以執行,什麼時候不可以執行,執行什麼內容。
經過我的總結,執行緒中通訊方法大致有如下三種:
threading.event
threading.condition
queue.queue
先丟擲結論,接下來我們來一一**下。
event事件
python提供了非常簡單的通訊機制 threading.event,通用的條件變數。多個執行緒可以等待某個事件的發生,在事件發生後,所有的執行緒都會被啟用。
關於event的使用也超級簡單,就三個函式
舉個例子來看下。
執行一下,看看結果
可見在所有執行緒都啟動(start())後,並不會執行完,而是都在self.event.wait()止住了,需要我們通過event.set()來給所有執行緒傳送執行指令才能往下執行。
condition
condition和event 是類似的,並沒有多大區別。
同樣,condition也只需要掌握幾個函式即可。
舉個網上乙個比較趣的捉迷藏的例子來看看
通過cond來通訊,阻塞自己,並使對方執行。從而,達到有順序的執行。
看下結果
queue佇列
終於到了我們今天的主角了。
從乙個執行緒向另乙個執行緒傳送資料最安全的方式可能就是使用 queue 庫中的佇列了。建立乙個被多個執行緒共享的 queue 物件,這些執行緒通過使用put() 和 get() 操作來向佇列中新增或者刪除元素。
同樣,對於queue,我們也只需要掌握幾個函式即可。
函式會比之前的多一些,同時也從另一方面說明了其功能更加豐富。
我來舉個老師點名的例子。
執行結果如下
總結學習了以上三種通訊方法,我們很容易就能發現event 和 condition 是threading模組原生提供的模組,原理簡單,功能單一,它能傳送 true 和 false 的指令,所以只能適用於某些簡單的場景中。
而queue則是比較高階的模組,它可能傳送任何型別的訊息,包括字串、字典等。其內部實現其實也引用了condition模組(譬如put和get函式的阻塞),正是其對condition進行了功能擴充套件,所以功能更加豐富,更能滿足實際應用。
python併發程式設計之多執行緒
程序包含了執行該程式所需要所有資源 程序是乙個資源單位 執行緒是cpu的最小執行單位 每乙個程序一旦被建立 就預設開啟了一條執行緒 稱之為主線程 使用執行緒可以提高程式效率 為何不用多程序提高效率 是因為程序對作業系統的資源耗費非常高 執行緒共享建立它的程序的位址空間 程序有自己的位址空間。執行緒可...
併發程式設計之 執行緒池
執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。他的主要特點為 執行緒復用 控制最大併發數,管理執行緒。第一 降低資源消耗。通過重複利用已建...
併發程式設計之執行緒池
步驟1 自定義拒絕策略介面 1 執行緒池狀態 threadpoolexecutor使用int的高3位來表示執行緒池狀態,低29位表示執行緒數量 從數字上比較,terminated tidying stop shutdown running 這些資訊儲存在乙個原子變數ctl中目的是將執行緒池狀態與執行...