11.条件变量
条件变量同步 也是一种锁
有一类线程需要满足条件之后才能继续执行,python提供了threading.Condition对象用于条件变量线程的支持。
lock_con=threading.Condition([Lock/Rlock]) 创建一个条件变量锁,锁是可选项,不填的话,对象自动创建一个RLock()
wait() 条件不满足时调用,线程会释放锁并进入阻塞
notify() 条件创造后调用,通知等待池(即被wait阻塞的代码处)激活一个线程
notifyAll() 条件创造后调用, 通知等待池激活所有线程
在不满足某线程程序运行的条件时,wait()释放锁,其他线程竞争使用该锁取创建线程运行的条件。当运行到notify(),或notifyAll()时,去唤醒其他线程执行
举例如下:
生产者和消费者
class Producer(threading.Thread): def run(self): global L while True: val=randint(0,100) print('生产者',self.name,'append'+str(val)) 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 1: lock_con.acquire() if len(L)==0: lock_con.wait() #当不满足条件时,即包子个数为0,释放解释器,程序停在这里,其他线程抢夺解释器。被重新激活后,执行下一条代码 print('消费者',self.name,'del'+str(L[0])) del L[0] lock_con.release() time.sleep(0.25) if __name__=='__main__': L=[] lock_con = threading.Condition() thre=[] for i in range(5): thre.append(Producer()) thre.append(Consumer()) for i in thre: i.start() for i in thre: i.join()

浙公网安备 33010602011771号