Python併發程式設計之執行緒訊息通訊機制/任務協調(四)
本文目錄
- 前言
- Event事件
- Condition
- Queue佇列
- 總結
. 前言
前面我已經向大家介紹了,如何使用建立執行緒,啟動執行緒。相信大家都會有這樣一個想法,執行緒無非就是建立一下,然後再start()
下,實在是太簡單了。
可是要知道,在真實的專案中,實際場景可要我們舉的例子要複雜的多得多,不同執行緒的執行可能是有順序的,或者說他們的執行是有條件的,是要受控制的。如果僅僅依靠前面學的那點淺薄的知識,是遠遠不夠的。
那今天,我們就來探討一下如何控制執行緒的觸發執行。
要實現對多個執行緒進行控制,其實本質上就是訊息通訊機制在起作用,利用這個機制傳送指令,告訴執行緒,什麼時候可以執行,什麼時候不可以執行,執行什麼內容。
經過我的總結,執行緒中通訊方法大致有如下三種:
- threading.Event
- threading.Condition
- queue.Queue
先丟擲結論,接下來我們來一一探討下。
. Event事件
Python提供了非常簡單的通訊機制Threading.Event
,通用的條件變數。多個執行緒可以等待某個事件的發生
,在事件發生後,所有的執行緒
都會被啟用
。
關於Event的使用也超級簡單,就三個函式
舉個例子來看下。
執行一下,看看結果
可見在所有執行緒都啟動(start()
)後,並不會執行完,而是都在self.event.wait()
止住了,需要我們通過event.set()
. Condition
Condition和Event 是類似的,並沒有多大區別。
同樣,Condition也只需要掌握幾個函式即可。
舉個網上一個比較趣的捉迷藏的例子來看看
通過cond來通訊,阻塞自己,並使對方執行。從而,達到有順序的執行。
看下結果
hider: 我已經把眼睛蒙上了
seeker: 我已經藏好了,你快來找我吧
hider: 我找到你了 ~_~
hider: 我贏了
seeker: 被你找到了,哎~~~
. Queue佇列
終於到了我們今天的主角了。
從一個執行緒向另一個執行緒傳送資料最安全的方式可能就是使用 queue 庫中的隊列了。建立一個被多個put()
和get()
操作來向佇列中新增或者刪除元素。
同樣,對於Queue,我們也只需要掌握幾個函式即可。
函式會比之前的多一些,同時也從另一方面說明了其功能更加豐富。
我來舉個老師點名的例子。
執行結果如下
開始點名~
老師:小明來了沒?
小明:到!
老師:小亮來了沒?
小亮:到!
. 總結
學習了以上三種通訊方法,我們很容易就能發現Event
和Condition
是threading模組原生提供的模組,原理簡單,功能單一,它能傳送True
和False
的指令,所以只能適用於某些簡單的場景中。
而Queue
則是比較高階的模組,它可能傳送任何型別的訊息,包括字串、字典等。其內部實現其實也引用了Condition
模組(譬如put
和get
函式的阻塞),正是其對Condition
進行了功能擴充套件,所以功能更加豐富,更能滿足實際應用。