WordPress课程广告

python Queue(进程队列)

释放双眼,带上耳机,听听看~!

在Python中我知道队列模块有:

  • from queue import Queue
    • 此模块适用于线程间通信,但不能用于进程间通信。
  • from multiprocessing import Queue
    • 此模块用于对进程,但是不能用于进程池。

下面笔记记录的就是:from multiprocessing import Queue 用于进程间通信的队列。

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

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

给TA打赏
共{{data.count}}人
人已打赏
Python笔记

Windows python安装教程(超详细)

2021-12-30 22:09:54

Python内置模块Python笔记

python os.path.dirname(__file__)

2022-1-3 22:31:10

WordPress网站建设宣传图片
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索