Python多线程通信queue队列用法实例分析
作者:随风行云 发布时间:2023-09-22 21:11:44
本文实例讲述了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,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程序设计有所帮助。
来源:https://www.cnblogs.com/progor/p/8436559.html
猜你喜欢
- 需求:用SQL语句随机从数据库中随机取N条数据。以前不太清楚SQL语句可以直接随机取数据今天查了一下,发现有两个随机函数: newid()
- 文件目录的创建和删除package mainimport( "fmt" "os")func main
- 在网上查阅资料,发现很少用Python进行高斯函数的三维显示绘图的,原因可能是其图形显示太过怪异,没有MATLAB精细和直观。回顾一下二维高
- 将数据写入Excel文件中,用python实现起来非常的简单,下面一步步地教大家。一、导入excel表格文件处理函数import xlwt注
- 针对border边框属性在浏览器中的渲染方式很早以前就开始在QQ群中看到大家在讨论,而我也一直以border:0 none;的方式处理。其中
- 三遍记忆,让你记住海量素材的准确位置和用途,提高其可用性.这仅仅是一个示意图.在以往的日子里,我做到了只要脑袋里冒出一个想法,立刻就能知道我
- PyQt5+requests实现一个车票查询工具,供大家参考,具体内容如下结构图效果图思路1、search(QPushButton)点击信号
- php获取文件创建时间、修改时间常用代码filemtime ( string filename )返回文件上次被修改的时间,出错时返回 FA
- 作用:用ASP程序将页面中的电话号码生成图片格式。 代码如下:<% Call Com_CreatValidCode
- 简单介绍Mac下使用HomeBrew安装Python 3.*版本并设置为默认值1、首先查看Mac自带的python,可以看到是2.7.10的
- # 从X和Y中取出相应步长对应的数组并保存至x_data和y_data中x_data = []y_data = []for i in ran
- 聚集索引,数据实际上是按顺序存储的,数据页就在索引页上。就好像参考手册将所有主题按顺序编排一样。一旦找到了所要搜索的数据,就完成了这次搜索,
- 图片人脸检测#coding=utf-8import cv2import dlibpath = "img/meinv.png&quo
- JS提供两个截取字符串的方法,分别是:slice()和substring()slice和substring都可以接受一个或两个参数,第1个参
- 引言在前面的文章当中我们讨论的是 python3 当中早期的内嵌数据结构字典的实现,在本篇文章当中主要介绍在后续对于字典的内存优化。字典优化
- 一个不错的绿色下划线的简洁CSS导航代码,纯css不用图片,效果图如下:<html> <head> <meta
- 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding=
- //********************************************************************
- 有时在项目中会遇到通过在页面中采用iframe的方式include其它页面,这时就会考虑不要因出现滚动条而影响页面效果,但include页面
- 使用conda安装requirement.txt的扩展包当你在GitHub上下载了代码时,可以看到有一个requirements.txt文件