有一類線程需要滿足條件之后才能夠繼續執行,
Python提供了threading.Condition 對象用於條件變量線程的支持,
它除了能提供RLock()或Lock()的方法外,
還提供了 wait()、notify()、notifyAll()方法。
wait([timeout]):線程掛起,直到收到一個notify通知或者超時(可選的,浮點數,單位是秒s)
才會被喚醒繼續運行。wait()必須在已獲得Lock前提下才能調用,否則會觸發RuntimeError。
調用wait()會釋放Lock,直至該線程被Notify()、NotifyAll()或者超時線程又重新獲得Lock.
notify(n=1):通知其他線程,那些掛起的線程接到這個通知之后會開始運行,
默認是通知一個正等待該condition的線程,最多則喚醒n個等待的線程。notify()必須在已獲得Lock前提下才能調用,
否則會觸發RuntimeError。notify()不會主動釋放Lock。
notifyAll(): 如果wait狀態線程比較多,notifyAll的作用就是通知所有線程(這個一般用得少)
lock_con=threading.Condition([Lock/Rlock]): 鎖是可選選項,
默認創建一個RLock(),一般都用默認。
import threading,time from random import randint class Producer(threading.Thread): def run(self): global L while True: val=randint(0,100) # print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') print('生產者',self.name,' Append'+str(val),L) if lock_con.acquire(): L.append(val) lock_con.notify() lock_con.release() time.sleep(3) class Consumer(threading.Thread): def run(self): global L while True: lock_con.acquire() if len(L)==0: lock_con.wait() print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') print('消費者',self.name,'Delete'+str(L[0]),L) del L[0] lock_con.release() time.sleep(0.5) if __name__=='__main__': L=[] lock_con=threading.Condition() threads=[] for i in range(5): threads.append(Producer()) threads.append(Consumer()) for t in threads: t.start() for t in threads: t.join()
我用的是python3.7,感覺python在多進程並發優化的原因輸出總是出現顯得很亂。
哪位大神知道可以說一下。