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+selenium实现自动抢票功能实例代码
Nov 23 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
基于python实现从尾到头打印链表
Nov 02 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
Python执行时间的几种计算方法
Jul 31 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
详解python polyscope库的安装和例程
Nov 13 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
python区块链实现简版工作量证明
May 25 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
PHP 选项及相关信息函数库
2006/12/04 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Django开发的简易留言板案例详解
2018/12/04 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
安全大检查实施方案
2014/02/22 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
班组建设经验交流材料
2014/05/12 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
医院科室评语
2015/01/04 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python