python Queue(队列)

微信扫一扫,分享到朋友圈

python Queue(队列)
0

部分内容来源以及相关资料:

Python 队列(Queue)用法

Python 多进程及进程间通信

带你深入了解生产消费者模型中task_done()具体作用

官方相关文档:

文档搜索:queue结果页面:https://docs.python.org/3.9/search.html?q=+queue

queue.Queue:queue — A synchronized queue class — Python 3.9.9 documentation

multiprocessing.Queue:https://docs.python.org/3.9/library/multiprocessing.html?highlight=queue#multiprocessing.Queue

Pipes(管道):pipes — Interface to shell pipelines — Python 3.10.1 documentation

每个进程都有自己的地址空间、内存、数据栈以及其他记录其运行状态的辅助数据,进程之间没有共享信息。

Python 的 multiprocessing 模块包装了底层的机制,提供了 Queue(队列)、Pipes(管道)等多种方式来交换数据。

我们可以通过 Queue(队列) 来实现进程间的通信。

队列的初始化:

q = Queue(num)

num为指定可接收的最大消息数量,如果没有指定或数量为负值,那么就代表可接收的消息数量没有上限(直到内存的尽头)。

Queue(队列) 常用方法:

Queue.qsize() 返回当前队列包含的消息数量

Queue.empty() 如果队列为空,返回True,反之False

Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应

Queue.get([block[, timeout]]) 获取队列中的一条消息,然后将其从队列中移除。

block 默认值为 True。如果 block 使用默认值,且没有设置 timeout(单位:秒),消息队列为空,此时程序将被阻塞(停在读取状态),直到从消息队列读到消息为止,如果设置了 timeout,则会等待 timeout 秒,若还没有读取到任何消息,则抛出 Queue.Empty 异常

Queue.get_nowait() 相当于Queue.get(False),非阻塞方法

Queue.put(item, block=True, timeout=None) 将 item 消息写入队列。

block用于设置是否阻塞,默认为True即阻塞,消息队列如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息队列腾出空间为止,如果设置了 timeout,则会等待 timeout 秒,若还没有空间,则抛出 Queue.full 异常。

Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。

Queue.join() 实际上意味着等到队列为空,再执行别的操作

实例练习代码:

# -*- coding: utf-8 -*-

from multiprocessing import Queue

# q = Queue(num) # 初始化一个 Queue对象 num为指定最大可接收的消息数量 不指定(为空)或者为负值,那么就代表可接收的消息数量没有上限(直到内存的尽头)。

q = Queue(3)  # 初始化一个 Queue对象 最多可以接收 3条put消息
"""
# 通过 Queue.put() 给队列添加队列消息
Queue.put(item, block=True, timeout=None)
Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
item:写入队列的消息
block:用于设置是否阻塞
默认为True即阻塞,消息队列如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息队列腾出空间为止。
如果设置为False, 如果消息队列已满 则抛出queue.Full异常
timeout: 等待时间,如果设置了 timeout,则会等待 timeout 秒,等待后还没有空间,则抛出 Queue.full 异常。

"""
q.put(1)
q.put(2)
q.put(3)
# q.put(4, block=False) 消息队列已满 这行代码开启 将抛出Queue.full 异常
# q.put(5, timeout=1) 消息队列已满 这行代码开启 将在延时一秒后 抛出Queue.full 异常

# 通过 Queue.full() 查看队列是否已满 是则返回True 反之则返回False
print(q.full())
# 输出结果:True
# 通过Queue.qsize() 查看当前队列包含消息数量
print(q.qsize())
# 输出结果:3

# Queue.empty() 判断队列是否为空 是则返回 True 反正则返回False
print(q.empty())
# 结果为 False
"""
通过 Queue.get(block=True, timeout=None]) 获取队列中的一条消息,然后将其从队列中移除
Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
block 用于设置是否阻塞block
默认值为 True。如果使用默认值,消息队列为空,此时程序将被阻塞(停在读取状态)直到从消息队列读到消息为止。
如果block 设置为False 当消息队列为空 则抛出_queue.Empty
timeout 等待时间 如果设置了 timeout,则会等待对应时间 若还没有读取到任何消息,则抛出_queue.Empty异常
"""
num1 = q.get()
print(num1)
num2 = q.get()
print(num2)
num3 = q.get()
print(num3)

# num4 = q.get(block=False) # 消息队列已为空,这行代码开启将抛出_queue.Empty异常
# num5 = q.get(timeout=1) # 消息队列已为空 这行代码开启将在延时1秒后 抛出_queue.Empty异常

# Queue.empty() 判断队列是否为空 是则返回 True 反正则返回False
print(q.empty())
# 结果为 True

微信扫一扫,分享到朋友圈

python Queue(队列)
0
上一篇

Windows python安装教程(超详细)

你也可能喜欢

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
微信 微信
微信
返回顶部