PYTHON——多執行緒:條件變數(Condition)
阿新 • • 發佈:2018-11-06
條件變數(Condition)也是一把鎖,除了同步鎖的作用外,還具有線上程間通訊的功能。
有一類執行緒需要滿足條件之後才能夠繼續執行,Python提供了threading.Condition 物件用於條件變數執行緒的支援,它除了能提供RLock()或Lock()的方法外,還提供了 wait()、notify()、notifyAll()方法。
lock_con=threading.Condition([Lock/Rlock]): 鎖是可選選項,不傳人鎖,物件自動建立一個RLock()。
wait():條件不滿足時呼叫,執行緒會釋放鎖並進入等待阻塞;
notify():條件創造後呼叫,通知等待池啟用一個執行緒;
notifyAll():條件創造後呼叫,通知等待池啟用所有執行緒。
例項程式碼:
import threading,time from random import randint class Producer(threading.Thread): def run(self): global L while True: val=randint(0,100) print('生產者',self.name,":Append"+str(val),L)if lock_con.acquire(): L.append(val) lock_con.notify() #通知消費者可以吃包子了,啟用wait。 lock_con.release() time.sleep(3) class Consumer(threading.Thread): def run(self): global L while True: lock_con.acquire()#wait阻塞後,從這裡開始這行,重新獲得鎖。 if len(L)==0: #如果包子架或容器中沒有包子,則等待。 lock_con.wait() #wait的作用:1、釋放鎖;2、阻塞,等待notify通知 print('消費者',self.name,":Delete"+str(L[0]),L) del L[0] lock_con.release() time.sleep(1) 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() #start了6個執行緒物件。 for t in threads: t.join() print('-------xiaohuchengsi,haha----------')