Skip to main content

18.5.8. 队列

队列:

asyncio队列API被设计为接近 queue 模块(QueuePriorityQueueLifoQueue)的类,但它没有 timeout 参数。 asyncio.wait_for() 功能可用于在超时后取消任务。

18.5.8.1. 队列

class asyncio.Queue(maxsize=0, *, loop=None)

队列,用于协调生产者和消费者协同。

如果 maxsize 小于或等于零,队列大小是无限的。如果它是大于 0 的整数,则当队列到达 maxsize 时,yield from put() 将阻塞,直到由 get() 移除项目。

与标准库 queue 不同,您可以使用 qsize() 可靠地知道此队列的大小,因为您的单线程异步应用程序不会在调用 qsize() 和对队列执行操作之间中断。

这个类是 不是线程安全

在 3.4.4 版更改: join()task_done() 方法。

empty()

如果队列为空,返回 True,否则返回 False

full()

如果队列中有 maxsize 项,则返回 True

注解

如果队列用 maxsize=0 (默认)初始化,则 full() 永远不是 True

coroutine get()

从队列中删除并返回项目。如果队列为空,请等待项目可用。

这种方法是 协同

参见

empty() 方法。

get_nowait()

从队列中删除并返回项目。

返回一个项目,如果一个立即可用,否则提出 QueueEmpty

coroutine join()

阻塞,直到队列中的所有项目都被获取和处理。

每当项目添加到队列时,未完成任务的计数就会增加。当消费者线程调用 task_done() 以指示该项目已被检索并且其上的所有工作都完成时,计数下降。当未完成任务的计数下降到零时,join() 解除阻塞。

这种方法是 协同

3.4.4 新版功能.

coroutine put(item)

将项目放入队列。如果队列已满,请等待一个空闲插槽可用,然后再添加项目。

这种方法是 协同

参见

full() 方法。

put_nowait(item)

将项目放入队列而不阻塞。

如果没有空闲时隙立即可用,则升高 QueueFull

qsize()

队列中的项目数。

task_done()

指示以前入队的任务已完成。

由队列使用者使用。对于用于获取任务的每个 get(),对 task_done() 的后续调用告诉队列任务上的处理完成。

如果 join() 当前阻塞,则当所有项目都被处理时(意味着对于已经被 put() 进入队列的每个项目接收到 task_done() 呼叫),它将恢复。

如果调用的次数比在队列中放置的项目多,则提升 ValueError

3.4.4 新版功能.

maxsize

队列中允许的项目数。

18.5.8.2. PriorityQueue

class asyncio.PriorityQueue

Queue 的子类;以优先级顺序(最低优先级)检索条目。

条目通常是以下形式的元组:(priority number,data)。

18.5.8.3. LifoQueue

class asyncio.LifoQueue

Queue 的子类,首先检索最近添加的条目。

18.5.8.3.1. 例外

exception asyncio.QueueEmpty

当对于为空的 Queue 对象调用 get_nowait() 方法时引发异常。

exception asyncio.QueueFull

当对已满的 Queue 对象调用 put_nowait() 方法时引发异常。