1. 程式人生 > >Python多執行緒學習(三、生產者與消費者)

Python多執行緒學習(三、生產者與消費者)

生產者與消費者問題是典型的同步問題。這裡簡單介紹兩種不同的實現方法。

1,條件變數

  

上面的例子中,在初始狀態下,Consumer處於wait狀態,Producer連續生產(對x執行增1操作)5次後,notify正在等待的ConsumerConsumer被喚醒開始消費(對x執行減1操作)

2,同步佇列

Python中的Queue物件也提供了對執行緒同步的支援。使用Queue物件可以實現多個生產者和多個消費者形成的FIFO的佇列。

生產者將資料依次存入佇列,消費者依次從佇列中取出資料。

在上面的例子中,Producer在隨機的時間內生產一個“產品”,放入佇列中。Consumer發現佇列中有了“產品”,就去消費它。本例中,由於Producer生產的速度快於Consumer消費的速度,所以往往Producer生產好幾個“產品”後,Consumer才消費一個產品。

Queue模組實現了一個支援多producer和多consumerFIFO佇列。當共享資訊需要安全的在多執行緒之間交換時,Queue非常有用。Queue的預設長度是無限的,但是可以設定其建構函式的maxsize引數來設定其長度。Queueput方法在隊尾插入,該方法的原型是:

put(item[, block[, timeout]])

如果可選引數blocktrue並且timeoutNone(預設值),執行緒被block,直到佇列空出一個數據單元。如果timeout大於0,在timeout的時間內,仍然沒有可用的資料單元,Full exception被丟擲。反之,如果block引數為false(忽略timeout引數),item被立即加入到空閒資料單元中,如果沒有空閒資料單元,Full exception被丟擲。

Queueget方法是從隊首取資料,其引數和put方法一樣。如果block引數為truetimeoutNone(預設值),執行緒被block,直到佇列中有資料。如果timeout大於0,在timeout時間內,仍然沒有可取資料,Empty exception被丟擲。反之,如果block引數為false(忽略timeout引數),佇列中的資料被立即取出。如果此時沒有可取資料,Empty exception也會被丟擲。