1. 程式人生 > 其它 >Python併發程式設計之執行緒訊息通訊機制/任務協調(四)

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 庫中的隊列了。建立一個被多個

二手賣號平臺地圖執行緒共享的 Queue 物件,這些執行緒通過使用put()get()操作來向佇列中新增或者刪除元素。

同樣,對於Queue,我們也只需要掌握幾個函式即可。

函式會比之前的多一些,同時也從另一方面說明了其功能更加豐富。

我來舉個老師點名的例子。

執行結果如下

開始點名~
老師:小明來了沒?
小明:到!
老師:小亮來了沒?
小亮:到!

. 總結

學習了以上三種通訊方法,我們很容易就能發現EventCondition是threading模組原生提供的模組,原理簡單,功能單一,它能傳送TrueFalse的指令,所以只能適用於某些簡單的場景中。

Queue則是比較高階的模組,它可能傳送任何型別的訊息,包括字串、字典等。其內部實現其實也引用了Condition模組(譬如putget函式的阻塞),正是其對Condition進行了功能擴充套件,所以功能更加豐富,更能滿足實際應用。