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参数,这是等待时间

    • 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 是双端队列,允许先入先出和后入后出,即两端都可以出

    • 由于双端队列实用性不大,实际上与列表没什么区别,在此不做阐述,大家可以参考://www.jb51.net/article/183382.htm

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

来源:https://www.cnblogs.com/progor/p/8436559.html

标签:Python,多线程通信,queue队列
0
投稿

猜你喜欢

  • Python 异常处理Ⅳ过程图解

    2023-06-28 16:05:53
  • MySQL和Python交互的示例

    2024-01-18 07:02:11
  • 关于python并发编程中的协程

    2023-10-18 04:37:44
  • 基于Python实现经典植物大战僵尸游戏

    2021-01-28 11:17:20
  • python 拷贝特定后缀名文件,并保留原始目录结构的实例

    2021-08-30 04:17:46
  • 详解MySQL的Seconds_Behind_Master

    2024-01-18 04:58:00
  • 在Golang中使用http.FileServer返回静态文件的操作

    2024-02-20 07:51:50
  • Anaconda超详细保姆级安装配置教程

    2022-09-06 08:11:50
  • Python3 使用pip安装git并获取Yahoo金融数据的操作

    2023-11-17 21:56:48
  • JS中call/apply、arguments、undefined/null方法详解

    2024-04-19 11:01:31
  • selenium+python自动化测试之页面元素定位

    2021-09-30 18:08:55
  • python argparse模块传参用法实例

    2022-01-19 09:53:42
  • JS实现pasteHTML兼容ie,firefox,chrome的方法

    2023-09-21 01:55:10
  • Python实现计算文件MD5和SHA1的方法示例

    2023-12-07 06:55:46
  • python3 字符串知识点学习笔记

    2023-05-02 16:25:35
  • Matlab实现新冠病毒传播模拟效果

    2022-01-23 00:01:28
  • javascript中传统事件与现代事件

    2024-04-10 11:02:57
  • Java并发编程数据库与缓存数据一致性方案解析

    2024-01-21 21:09:47
  • Vue+Java+Base64实现条码解析的示例

    2024-05-02 17:08:27
  • JavaScript设计模式之原型模式分析【ES5与ES6】

    2024-05-02 16:29:37
  • asp之家 网络编程 m.aspxhome.com