圆月山庄资源网 Design By www.vgjia.com
本文实例讲述了Python多线程通信queue队列用法。分享给大家供大家参考,具体如下:
queue:
- 什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。
- 线程之间的通信可以使用队列queue来进行
- 线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信:
【下例为:sender线程发送直径给recvder线程,recvder计算得出周长】
import threading,time,queue,random def sender():#sender发送直径 while True: x=random.randint(1,10) print("send done:",x) q.put(x)#每个一秒就放入一个随机数 time.sleep(1)#每隔一秒就放入一个a def 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,random def sender():#sender发送直径 while True: x=random.randint(1,10) print("send done:",x) q.put(x)#每个一秒就放入一个随机数 time.sleep(1)#每隔一秒就放入一个a def 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的设置:
队列的其他相关函数【设q为一个Queue对象】:
- q.qsize():返回当前队列的元素个数
- q.empty():判断队列是否空,返回布尔值
- q.full():判断队列是否满,返回布尔值
- q.get_nowait():直接使用get(),如果此时队列中没有元素,那么会阻塞等待,使用get_nowait()后,如果队列中没有元素,那么会报错
- q.put_nowait():直接使用put(),如果此时队列满了,那么会阻塞等待,使用put_nowait()后,如果队列已经满了,那么会报错
- q.task_done() :在完成一项工作之后,task_done()函数向任务已经完成的队列发送一个信号【功能类似于:有一个只能承重一个人的独木桥,A来了发现B在桥上,所以A不能上桥,他就在等,等到B过完桥后喊一下他,他才知道B过完桥了】【q.task_done主要是跟q.join()配合使用的】
- q.join():实际上意味着等到队列为空,再执行别的操作【每次get后需要调用task_done,直到所有队列为空,这时才会执行join下面的】
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()
queue中除了Queue之外,还有其他的队列,下面是常用的几个:
- Queue是先入先出的队列:
- LifoQueue则是后入先出的队列:
- PriorityQueue是由装入元素时指定的优先级来决定出元素的顺序的:
- 创建方法:队列对象=queue.PriorityQueue()
- 优先级是小的优先,但不能混合排序,str的只能跟str的一起排序,int的只能跟int一起排序
- PriorityQueue的put的参数是元组,格式为:队列对象.put((优先级, 数据))
- deque 是双端队列,允许先入先出和后入后出,即两端都可以出
- 由于双端队列实用性不大,实际上与列表没什么区别,在此不做阐述,大家可以参考://www.jb51.net/article/183382.htm
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月02日
2024年11月02日
- 群星《伤感民谣2CD》黑胶母盘直刻DTS[WAV分轨][1.9G]
- lol全球总决赛lpl一号种子是谁 S14全球总决赛lpl一号种子队伍
- lol全球总决赛哪只队伍最年轻 2024世界赛最年轻队伍排名
- lol全球总决赛lpl二号种子是谁 S14全球总决赛lpl二号种子队伍介绍
- 恩雅-雨过天晴DTS-WAV
- 王心雅《诗意琼瑶》DTS-WAV
- 阿丽娅《印象》DTS6.1-WAV
- PS官方晒《怪物猎人:荒野》公测启动页面!你准备好了吗?
- 《怪物猎人:荒野》新怪物“赫猿兽”PV公布:残暴巨兽登场!
- 童丽2024 《千愁记旧情》8月最新 限量1:1母盘直刻[WAV+CUE][1.1G]
- 陈奕迅《认了吧》[新加坡纸盒版] [WAV+CUE][1.1G]
- 群星《小夫妻 电视原声带》[320K/MP3][113.44MB]
- 孙楠.2004-燃烧【华纳】【WAV+CUE】
- 群星.2003-英皇精挑细选VOL.1【英皇娱乐】【WAV+CUE】
- 林姗.2024-寄天的记忆【豪记】【FLAC分轨】