Condition版的生產者和消費者模式
threading.Condition 在沒有數據的時候處於阻塞狀態,有數據能夠使用notify的函數通知等等待狀態的線程運做
threading.Condition 其實是繼承threading.Lock
acquire:上鎖。
release:解鎖。
wait:將當前線程處於等待狀態,而且會釋放鎖。能夠被其餘線程使用notify和notify_all函數喚醒。被喚醒後會繼續等待上鎖,上鎖後繼續執行下面的代碼。
notify:通知某個正在等待的線程,默認是第1個等待的線程。
notify_all:通知全部正在等待的線程。notify和notify_all不會釋放鎖。而且須要在release以前調用。
gLoad = threading.Condition()dom
''' Condition版的生產者和消費者模式 ''' import threading import random import time gMoney = 1000 # 原始金額 gLoad = threading.Condition() gTime = 0 # 生產次數 class Producer(threading.Thread): def run(self): global gMoney global gTime while True: gLoad.acquire() if gTime < 10: gTime += 1 money = random.randint(50,500) gMoney += money print("生產線程%s生成了%d元,剩餘%d元"%(threading.current_thread(),money,gMoney)) else: gLoad.release() break gLoad.notify_all() # 通知全部阻塞的線程,在釋放鎖以前 gLoad.release() time.sleep(2) class Consumer(threading.Thread): def run(self): global gMoney global gTime while True: gLoad.acquire() money = random.randint(100,1000) while money > gMoney: if gTime == 10: gLoad.release() return print("消費線程%s準備消費了%d元,剩餘%d元,不足" % (threading.current_thread(), money, gMoney)) gLoad.wait() # 使進程在阻塞狀態,同時釋放鎖 gMoney -= money print("消費線程%s消費了%d元,剩餘%d元" % (threading.current_thread(), money, gMoney)) gLoad.release() time.sleep(2) def main(): for x in range(3): t = Consumer(name="消費者線程%s"%x) t.start() for x in range(5): t = Producer(name="生產者線程%s"%x) t.start() if __name__ == '__main__': main()