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()

 

posted @ 2020-10-29 23:03  maday  阅读(93)  评论(0)    收藏  举报