Python semaphore evevt生产者消费者模型原理解析
线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量
importthreading,time,queue deftest(name): semaphore.acquire()#获取信号量锁 print('mynameis%s'%name) time.sleep(1) semaphore.release()#释放信号量锁 semaphore=threading.BoundedSemaphore(5)#创建一个信号量同时可以运行3个线程 foriinrange(20): t=threading.Thread(target=test,args=(i,)) t.start() whilethreading.active_count()==1: print("allrundone")
两个或者多个线程需要交互时,且一个进程需要根据另一线程状态执行对应操作时,可以通过event来设置线程状态达到期望的效果,下面是一个红绿灯的例子
event=threading.Event()#实例化一个event deflight(): whileTrue: print("红灯亮了,请停车") time.sleep(20)#开始是红灯20s event.set()#红灯时间到了,设置标志位 print("绿灯亮了,请通行") time.sleep(30)#持续30s红灯 event.clear()#清空标志位 defcar(num): whileTrue: ifevent.is_set():#检测event被设置则执行 print("car%srun"%num) time.sleep(5) else: print("thisisredlightwaiting") event.wait()#此处会卡主,直到状态被设置才会向下执行 Light=threading.Thread(target=light,) Light.start() foriinrange(10): Car=threading.Thread(target=car,args=(i,)) Car.start()
当多个线程需要交互数据可以使用queue来进行数据传递,下面是经典的生产者消费者多线程模型示例,其中包含线程queue的基本使用方法
my_queue=queue.Queue()#实例化一个队列 queue1=queue.LifoQueue()#后进先出队列 queue2=queue.PriorityQueue()#带优先级的队列 defpro(): foriinrange(100): my_queue.put(i)#队列里面放数据 defcon(): whilemy_queue.qsize()>0:#当队列有数据时候从队列取数据 print("ianaconsumer,getnum%s"%my_queue.get(timeout=3)) time.sleep(2) else: print("myqueueisempty") Pro=threading.Thread(target=pro) Pro.start() forjinrange(10): Con=threading.Thread(target=con) Con.start()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。