异步的目的是什么.队列()以及如何正确使用它?



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

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

asyncio.Queues是普通Pythonqueue的演绎,但具有特殊的异步属性。以下功能值得关注:

coroutine get()

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

coroutine put(item)

将项目放入队列中。如果队列已满,请等到有可用插槽后再添加项目。

coroutine join()

阻止,直到接收并处理队列中的所有项目。

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

以收集、过滤和使用一些对象(无论您希望它们是什么(为例。假设您异步收集 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!
...

其中用-> filtering表示的对象已经处于其操作的下一阶段,并且已经收集和过滤了-> stored!。当您意识到最好在达到存储对象的数量n停止筛选时,asyncio.queue的有用性就会出现,因为筛选会占用线程并导致您无法有效地使用已过滤的对象。因此,您的堆栈最终可能如下所示:

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的例子,但上面例子的想法是让你开始看到异步编程是如何成为编程的一个不同维度的——你应该了解事物在微观和宏观尺度上的相关性。函数如何自行运行,以及函数如何与其他函数交互(在异步函数的情况下,不允许另一个函数运行(。Asyncio原语是这个概念的核心,值得我们去理解。

最新更新