1. 程式人生 > >PYTHON——多執行緒:條件變數(Condition)

PYTHON——多執行緒:條件變數(Condition)

  條件變數(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----------')