當小夥伴a在往火鍋裏面添加魚丸,這個就是生產者行爲;另一個小夥伴b在吃掉魚丸就是消費者行爲。當火鍋裏面魚丸達到必定數量加滿後b才能吃,這就是一種條件判斷了。
這就是本篇要講的Condition(條件變量)python
Condition(條件變量)一般與一個鎖關聯。須要在多個Contidion中共享一個鎖時,能夠傳遞一個Lock/RLock實例給構造方法,不然它將本身生成一個RLock實例。ui
能夠認爲,除了Lock帶有的鎖定池外,Condition還包含一個等待池,池中的線程處於狀態圖中的等待阻塞狀態,直到另外一個線程調用notify()/notifyAll()通知;獲得通知後線程進入鎖定池等待鎖定。線程
Condition():code
實現場景:當a同窗王火鍋裏面添加魚丸加滿後(最多5個,加滿後通知b去吃掉),通知b同窗去吃掉魚丸(吃到0的時候通知a同窗繼續添加)utf-8
# coding=utf-8 import threading import time con = threading.Condition() num = 0 # 生產者 class Producer(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): # 鎖定線程 global num con.acquire() while True: print "開始添加!!!" num += 1 print "火鍋裏面魚丸個數:%s" % str(num) time.sleep(1) if num >= 5: print "火鍋裏面裏面魚丸數量已經到達5個,沒法添加了!" # 喚醒等待的線程 con.notify() # 喚醒小夥伴開吃啦 # 等待通知 con.wait() # 釋放鎖 con.release() # 消費者 class Consumers(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): con.acquire() global num while True: print "開始吃啦!!!" num -= 1 print "火鍋裏面剩餘魚丸數量:%s" %str(num) time.sleep(2) if num <= 0: print "鍋底沒貨了,趕忙加魚丸吧!" con.notify() # 喚醒其它線程 # 等待通知 con.wait() con.release() p = Producer() c = Consumers() p.start() c.start()
運行結果:
開始添加!!!
火鍋裏面魚丸個數:1
開始添加!!!
火鍋裏面魚丸個數:2
開始添加!!!
火鍋裏面魚丸個數:3
開始添加!!!
火鍋裏面魚丸個數:4
開始添加!!!
火鍋裏面魚丸個數:5
火鍋裏面裏面魚丸數量已經到達5個,沒法添加了!
開始吃啦!!!
火鍋裏面剩餘魚丸數量:4
開始吃啦!!!
火鍋裏面剩餘魚丸數量:3
開始吃啦!!!
火鍋裏面剩餘魚丸數量:2
開始吃啦!!!
火鍋裏面剩餘魚丸數量:1
開始吃啦!!!
火鍋裏面剩餘魚丸數量:0
鍋底沒貨了,趕忙加魚丸吧!
開始添加!!!
火鍋裏面魚丸個數:1
開始添加!!!
火鍋裏面魚丸個數:2
開始添加!!!
火鍋裏面魚丸個數:3
開始添加!!!
火鍋裏面魚丸個數:4
開始添加!!!
火鍋裏面魚丸個數:5it
python自動化交流 QQ羣:779429633自動化