18.5.8. 队列

队列:

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

18.5.8.1. Queue

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

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

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

与标准库队列不同,您可以使用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()当前正在阻塞,它将在所有项目都已处理完毕后恢复(这意味着task_done() put()已经被队列中的所有put方法调用过。

如果调用的次数比在队列中放置的项目多,将引发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. Exceptions

exception asyncio.QueueEmpty

队列对象为空时调用get_nowait()方法时引发的异常。

exception asyncio.QueueFull

put_nowait()方法在已满的队列对象上调用时引发异常。