《Pythonthreading模块condition原理及运行流程详解》由会员分享,可在线阅读,更多相关《Pythonthreading模块condition原理及运行流程详解(2页珍藏版)》请在金锄头文库上搜索。
1、Pythonthreading模块conditio原理及运行流程详解onditio的处理流程如下:首先acire个条件变量,然后判断一些条件。*如果条件不满足则ait如果条件满足,进行一些处理改变条件后,通过noti方法通知其他线程,其他处于ai状态的线程接到通知后会重新判断条件。-不断的重复这一过程,从而解决复杂的同步问题。onditio的基本原理如下:可以认为onditio对象维护了一个锁(oc和o一个aitin池。线程通过aci获得onditio对象,当调用ai右法时,线程会释放onditio内部的锁并进入oc状态,同时在aitin池中记录这个线程。当调用noti方法时,onditio对
2、象会从aitin池中挑选一个线程,通知其调用ac旄法尝试取到锁。onditio对象的构造函数可以接受一个ocL寸象乍为参数,如果没有指定,则onditio对象会在内部自行创建一个oc。除了noti方法外,onditio对象还提供了notiy方法,可以通知aitin池中的所有线程尝试aci内部锁。由于上述机制,处于aitin状态的线程只能通过noti方法唤醒,所以notiy的作用在于防止有的线程永远处于沉默状态。演示条件变量同步的经典问题是生产者与消费者问题:假设有一群生产者Prodc和一群消费者(on)e通过一个市场来交互产品。生产者的策略是如果市场上剩余的产品少于个,那么就生产个产品放到市场
3、上;而消费者的策略是如果市场上剩余产品的数量多余个,那么就消费个产品。用onditio解决生产者与消费者问题的代码如下:codingtreatedonedoauthor:18665i)portthreadingi)portti)ec,assProducer(threading.Thread):生#产者函数defrun(se,f):g,oba,countwhi,eTrue:ifcon.acquire():当cont于等于的时候进行生产icontconaiteeconttrcontcontcontgenaerodcerintg完成生成后唤醒aitin状态的线程,从aitin池中挑选一个线程,通知其
4、调用ac方法尝试取到锁connotiyconreeaetieeecaonerthreadinghread消费者函数defrun(se,f):g,oba,countwhi,eTrue:当con以于等于的时候进行消费iconacireicontconaite,se:contcontgenaerintgconnotiyconsu)ecounttr(count#完成生成后唤醒waiting状态的线程,#从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁con.release()time.sleep(1)count=500con=threading.Condition()deftest():foriinrange(2):p=Producer().start()foriinrange(5):c=Consumer().start()if_name_=_main_:test()以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。