Python多线程通信queue队列用法实例分析
本文实例讲述了Python多线程通信queue队列用法。分享给大家供大家参考,具体如下:
queue: 什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。 线程之间的通信可以使用队列queue来进行 线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信: 1.创建一个Queue对象:对象=queue.Queue(x),x是队列容量,x可以不填,默认没有容量限制, 2.get()可以使线程从队列中获取一个元素,如果队列为空,get会等待,get可以设置timeout参数,这是等待时间 3.put()可以往队列中放入一个元素【默认队列Queue是先入先出的,先放入的元素会先取出去】,如果队列满了,put会等待,put可以设置timeout参数,这是等待时间
【下例为:sender线程发送直径给recvder线程,recvder计算得出周长】
import threading,time,queue,randomdef sender():#sender发送直径 while True: x=random.randint(1,10) print('send done:',x) q.put(x)#每个一秒就放入一个随机数 time.sleep(1)#每隔一秒就放入一个adef recvder():#recvder计算周长 while True: x=q.get() print('recv done:',x*3.14)#每隔一秒就取出一个元素,计算结果 time.sleep(1)q=queue.Queue()t1=threading.Thread(target=sender)t2=threading.Thread(target=recvder)t1.start()t2.start()t1.join()t2.join() Queue 对象已经包含了必要的锁,所以不用担心会出错
import threading,time,queue,randomdef sender():#sender发送直径 while True: x=random.randint(1,10) print('send done:',x) q.put(x)#每个一秒就放入一个随机数 time.sleep(1)#每隔一秒就放入一个adef recvder():#recvder计算周长 while True: x=q.get() print(threading.current_thread(),'recv done:',x*3.14)#每隔一秒就取出一个元素,计算结果 time.sleep(2)q=queue.Queue()t1=threading.Thread(target=sender)t2=threading.Thread(target=recvder)t3=threading.Thread(target=recvder)t1.start()t2.start()t3.start()t1.join()t2.join()t3.join()
注:
队列可以有容量限制:
timeout的设置:
import threading,queue,time'''这个例子是:厂家跟司机约定,生产满3个,司机才来拉,而一个个拉走,只有当3个都拉走,厂家才继续生产'''def producer():#厂家 while True: for i in range(3): q.put(i) start_time=time.time() q.join()##结果显示join这里堵塞住了厂家线程 print('wait time:',time.time()-start_time)#用来测试是否堵塞,证明不是因为司机的sleep堵塞运行def driver():#老司机 while True: for i in range(3): print(q.get()) q.task_done() print('') time.sleep(2)q=queue.Queue()t1=threading.Thread(target=producer)t2=threading.Thread(target=driver)t1.start()t2.start()t1.join()t2.join()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
相关文章:
