首頁  >  文章  >  後端開發  >  python Condition物件生產者與消費者操作的程式碼實例

python Condition物件生產者與消費者操作的程式碼實例

Y2J
Y2J原創
2017-05-04 11:19:091779瀏覽

這篇文章主要介紹了python條件變數生產者與消費者操作,結合具體實例形式分析了Python條件變數的概念、原理、及線程操作的相關技巧,需要的朋友可以參考下

本文實例講述了python條件變數之生產者與消費者操作。分享給大家供大家參考,具體如下:

互斥鎖是最簡單的線程同步機制,面對複雜線程同步問題,Python也提供了Condition物件。 Condition被稱為條件變量,除了提供與Lock類似的acquire和release方法外,還提供了wait和notify方法。線程先acquire一個條件變量,然後再判斷一些條件。如果條件不滿足則wait;如果條件滿足,進行一些處理改變條件後,透過notify方法通知其他線程,其他處於wait狀態的線程接到通知後會重新判斷條件。不斷的重複這個過程,從而解決複雜的同步問題。

可以認為Condition物件維護了一個鎖定(Lock/RLock)和一個waiting池。執行緒透過acquire取得Condition對象,當呼叫wait方法時,執行緒會釋放Condition內部的鎖定並進入blocked狀態,(但實際上不會block目前執行緒)同時在waiting池中記錄這個執行緒。當呼叫notify方法時,Condition物件會從waiting池中挑選一個線程,通知其呼叫acquire方法嘗試取到鎖。

Condition物件的建構子可以接受一個Lock/RLock物件作為參數,如果沒有指定,則Condition物件會在內部自行建立一個RLock。

線程同步經典問題----生產者與消費者問題可以使用條件變數輕鬆解決。

import threading
import time
class Producer(threading.Thread):
  def init(self):
    threading.Thread.init(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count <20:
        count += 1
        print self.name," Producer product 1,current is %d" %(count)
        con.notify()
      else:
        print self.name,"Producer say box is full"
        con.wait()
      con.release()
      time.sleep(1)
class Consumer(threading.Thread):
  def init(self):
    threading.Thread.init(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count>4:
        count -=4
        print self.name,"Consumer consume 4,current is %d" %(count)
        con.notify()
      else:
        con.wait()
        print self.name," Consumer say box is empty"
      con.release()
      time.sleep(1)
count = 0
con = threading.Condition()
def test():
  for i in range(1):
    a = Consumer()
    a.start()
  for i in range(1):
    b =Producer()
    b.start()
if name==&#39;main&#39;:
  test()

上面的程式碼假定消費者消費的比較快,輸出結果為:

以上是python Condition物件生產者與消費者操作的程式碼實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn