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中join和split用法实例
Apr 14 Python
通过源码分析Python中的切片赋值
May 08 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
python opencv读mp4视频的实例
Dec 07 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
python实现吃苹果小游戏
Mar 21 Python
Python创建临时文件和文件夹
Aug 05 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
Zend公司全球首推PHP认证
2006/10/09 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
python中函数默认值使用注意点详解
2016/06/01 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
pymysql 开启调试模式的实现
2019/09/24 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
HR求职自荐信范文
2014/06/21 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python