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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。