Condition
Condition(條件變量)通常與一個鎖關聯。需要在多個Contidion中共享一個鎖時,可以傳遞一個Lock/RLock實例給構造方法,否則它將自己生成一個RLock實例。
可以認爲,除了Lock帶有的鎖定池外,Condition還包含一個等待池,池中的線程處於狀態圖中的等待阻塞狀態,直到另一個線程調用notify()/notifyAll()通知;得到通知後線程進入鎖定池等待鎖定。
構造方法:
Condition([lock/rlock])
實例方法:
acquire([timeout])/release(): 調用關聯的鎖的相應方法。
wait([timeout]): 調用這個方法將使線程進入Condition的等待池等待通知,並釋放鎖。使用前線程必須已獲得鎖定,否則將拋出異常。
notify(): 調用這個方法將從等待池挑選一個線程並通知,收到通知的線程將自動調用acquire()嘗試獲得鎖定(進入鎖定池);其他線程仍然在等待池中。調用這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將拋出異常。
notifyAll(): 調用這個方法將通知等待池中所有的線程,這些線程都將進入鎖定池嘗試獲得鎖定。調用這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將拋出異常。
常見使用:
#coding=utf-8 __author__ = 'Bruce_Zhou' import threading import time import datetime num = 0 con = threading.Condition() class Gov(threading.Thread): def __init__(self): super(Gov, self).__init__() def run(self): global num con.acquire() while True: print "開始拉昇股市" num += 1 print "拉昇了" + str(num) + "個點" time.sleep(2) if num == 5: print "暫時安全!" con.notify() con.wait() con.release() class Consumers(threading.Thread): def __init__(self): super(Consumers, self).__init__() def run(self): global num con.acquire() while True: if num > 0: print "開始打壓股市" num -= 1 print "打壓了" + str(num) + "個點" time.sleep(2) if num == 0: print "你妹的!天台在哪裏!" con.notify() con.wait() con.release() if __name__ == '__main__': p = Gov() c = Consumers() p.start() c.start()
https://www.cnblogs.com/zj1111184556/p/4612470.html