Python多线程通信queue队列用法实例分析


Posted in Python onMarch 24, 2020

本文实例讲述了Python多线程通信queue队列用法。分享给大家供大家参考,具体如下:

queue:

  • 什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。
  • 线程之间的通信可以使用队列queue来进行
  • 线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信:
    • 1.创建一个Queue对象:对象=queue.Queue(x),x是队列容量,x可以不填,默认没有容量限制,    
    • 2.get()可以使线程从队列中获取一个元素,如果队列为空,get会等待,get可以设置timeout参数,这是等待时间
    • 3.put()可以往队列中放入一个元素【默认队列Queue是先入先出的,先放入的元素会先取出去】,如果队列满了,put会等待,put可以设置timeout参数,这是等待时间
    • Python多线程通信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()

注:

队列可以有容量限制:

Python多线程通信queue队列用法实例分析

timeout的设置:

Python多线程通信queue队列用法实例分析


队列的其他相关函数【设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()

Python多线程通信queue队列用法实例分析


queue中除了Queue之外,还有其他的队列,下面是常用的几个:

  • Queue是先入先出的队列:

Python多线程通信queue队列用法实例分析

  • LifoQueue则是后入先出的队列

Python多线程通信queue队列用法实例分析

  • PriorityQueue是由装入元素时指定的优先级来决定出元素的顺序的:
    • 创建方法:队列对象=queue.PriorityQueue()
    • 优先级是小的优先,但不能混合排序,str的只能跟str的一起排序,int的只能跟int一起排序
    • PriorityQueue的put的参数是元组,格式为:队列对象.put((优先级, 数据))

Python多线程通信queue队列用法实例分析Python多线程通信queue队列用法实例分析

  • deque 是双端队列,允许先入先出和后入后出,即两端都可以出
    • 由于双端队列实用性不大,实际上与列表没什么区别,在此不做阐述,大家可以参考://3water.com/article/183382.htm

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python读取Android permission文件
Nov 01 Python
Python实现快速多线程ping的方法
Jul 15 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
django模板加载静态文件的方法步骤
Mar 01 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
Pytorch之卷积层的使用详解
Dec 31 Python
python中pyqtgraph知识点总结
Jan 26 Python
pycharm部署、配置anaconda环境的教程
Mar 24 #Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 #Python
Python3 中sorted() 函数的用法
Mar 24 #Python
python3 deque 双向队列创建与使用方法分析
Mar 24 #Python
pyqt5 QlistView列表显示的实现示例
Mar 24 #Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 #Python
PyQt5中向单元格添加控件的方法示例
Mar 24 #Python
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
js面向对象编程总结
2017/02/16 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
详解vue-cli项目开发/生产环境代理实现跨域请求
2019/07/23 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
党员政治学习材料
2014/05/14 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
作弊检讨书
2015/01/27 职场文书
会计主管岗位职责
2015/04/02 职场文书
文明旅游倡议书
2015/04/28 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书