Python 3.x asyncio.Queue()的用途是什么?如何正确使用它?

Python 3.x asyncio.Queue()的用途是什么?如何正确使用它?,python-3.x,python-asyncio,aiohttp,Python 3.x,Python Asyncio,Aiohttp,我已经熟悉python,但我刚刚开始学习“异步编程”和“io任务”这两个主题。在教程中,我看到asyncio.Queue()与生产者和消费者相关的东西一起使用,但我不太理解 有人可以简化它,并给出几个例子吗?是普通Python的一种格式副本,但具有特殊的异步属性。以下功能值得注意: coroutine get() 从队列中删除并返回项目。如果队列为空,请等待项目可用 coroutine put(项目) 将项目放入队列。如果队列已满,请等待空闲插槽可用后再添加项目 coroutine join()

我已经熟悉python,但我刚刚开始学习“异步编程”和“io任务”这两个主题。在教程中,我看到
asyncio.Queue()
与生产者和消费者相关的东西一起使用,但我不太理解

有人可以简化它,并给出几个例子吗?

是普通Python的一种格式副本,但具有特殊的异步属性。以下功能值得注意:

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

coroutine put(项目)
将项目放入队列。如果队列已满,请等待空闲插槽可用后再添加项目

coroutine join()
阻止,直到队列中的所有项目都已接收并处理完毕

如果您了解异步代码的一般概念(代码在同一线程中运行,但在操作之间不断切换),您应该了解异步队列的一般用途——即允许使用
get()
put()
方法灵活地执行
wait
操作

以收集、过滤和使用某些对象(无论您希望它们是什么)为例。假设异步收集30个对象,其中每个收集函数需要1-5秒。假设您要过滤这些对象,过滤需要4到7秒。过滤功能在收集完成后立即启动,因此在
asyncio.loop
中的某个点上,您可能会执行以下操作:

object gathering...
object gathered -> filtering -> stored!
object gathering...
object gathering...
object gathered -> filtering...
object gathered -> filtering...
object gathering...
object gathered -> filtering -> stored!
...
其中用
->过滤
表示的对象已经处于其操作的下一阶段,并且
->已存储已被收集和筛选。在上述场景中,
asyncio.queue
的用处在于,当您意识到当您达到存储对象的
n
数量时,最好停止过滤,因为过滤占用了线程,并导致您无法有效地使用已过滤的对象。因此,您的堆栈可能最终看起来是这样的:

object gathering -> (waiting for queue to have space)
object gathered -> filtering -> stored!
object gathered -> (waiting for queue to have space)
object gathered -> (waiting for queue to have space)
object gathered -> filtered -> stored!
object gathered -> filtered -> stored!
object gathered -> (waiting for queue to have space)
object gathered -> filtering -> stored!
...

这是关于如何使用
asyncio.queue
的数百万例子中的一个,但上面这个例子的想法是让您开始了解异步编程是如何从不同的角度进行编程的——您应该理解微观和宏观尺度上的事物的相关性。函数本身如何运行,以及函数如何与其他函数交互(在异步函数的情况下,通过不允许另一个函数运行)。是这个概念的核心,值得理解。

这是否回答了您的问题?欢迎来到StackOverflow!请注意,你应该问一个关于你遇到的具体问题的问题,而不是在课堂上寻求帮助。如前所述,你的问题很难回答,因为不清楚你的知识水平和先前的经验。