天天看點

python 多線程筆記(5)-- 生産者/消費者模式

我們已經知道,對公共資源進行互斥通路,可以使用Lock上鎖,或者使用RLock去重入鎖。

但是這些都隻是友善于處理簡單的同步現象,我們甚至還不能很合理的去解決使用Lock鎖帶來的死鎖問題。

要解決更複雜的同步問題,就必須考慮别的辦法了。

threading提供的Condition對象提供了對複雜線程同步問題的支援。

Condition被稱為條件變量,除了提供與Lock類似的acquire和release方法外,還提供了wait和notify方法。

使用Condition的主要方式為:

線程首先acquire一個條件變量,然後判斷一些條件。如果條件不滿足則wait;如果條件滿足,進行一些 處理改變條件後,通過notify方法通知其他線程,其他處于wait狀态的線程接到通知後會重新判斷條件。不斷的重複這一過程,進而解決複雜的同步問 題。

下面我們通過很著名的“生産者-消費者”模型來來示範下,在Python中使用Condition實作複雜同步。

生産者和消費者,各一個線程,雙方将會圍繞products來産生同步問題,首先是2個生成者生産products ,而接下來的10個消費者将會消耗products

另外:

Condition對象的構造函數可以接受一個Lock/RLock對象作為參數,

如果沒有指定,則Condition對象會在内部自行建立一個 RLock;

除了notify方法外,Condition對象還提供了notifyAll方法,可以通知waiting池中的所有線程嘗試acquire 内部鎖。

由于上述機制,處于waiting狀态的線程隻能通過notify方法喚醒,是以notifyAll的作用在于防止有線程永遠處于沉默狀态。