asyncio队列的奇怪行为

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asyncio队列的奇怪行为相关的知识,希望对你有一定的参考价值。

为什么asyncio Queue在这里表现得如此奇怪,即使把项目放在那里它显示为空?

In [1]: from multiprocessing import Queue

In [2]: q = Queue()

In [3]: q.empty()
Out[3]: True

In [4]: q.put(100)

In [5]: q.empty()
Out[5]: False

In [6]: from asyncio import Queue

In [7]: q = Queue()

In [8]: q.empty()
Out[8]: True

In [9]: q.put(100)
Out[9]: <generator object Queue.put at 0x7f97849bafc0>

In [10]: q.empty()
Out[10]: True
答案

因为你没有放任何东西:

q.put(100)

put在这里 - 不是一个普通的功能,它是一个coroutine。你should await它把项目放入队列。

例如:

import asyncio
from asyncio import Queue


async def main():
    q = Queue()

    print(q.empty())  # True

    await q.put(100)

    print(q.empty())  # False


if __name__ ==  '__main__':
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        loop.run_until_complete(loop.shutdown_asyncgens())
        loop.close()
另一答案

正如Mikhail Gerasimov的回答,q.put(100)coroutine并解释更多细节......

调用协程不会启动其代码运行 - 调用返回的协程对象在您安排执行之前不会执行任何操作。启动它运行有两种基本方法:调用await coroutine或从另一个协同程序的coroutine中获取(假设其他协程已在运行!),或使用ensure_future()函数或AbstractEventLoop.create_task()方法安排执行。

协程(和任务)只能在事件循环运行时运行。

它来自Python Coroutines doc

在Mikhail Gerasimov的例子中,另一个coroutine async def main()await coroutine调用q.put(100),并且事件循环正在运行loop.run_until_complete(main()),如上面的描述。

以上是关于asyncio队列的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

当对头元素使用引用时,C++ 优先级队列的行为很奇怪

对 JMS 队列上的消息进行计数时的奇怪行为

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段

使用队列会导致 asyncio 异常“将 Future <Future pending> 附加到不同的循环”

listView 中复选框的奇怪行为

片段 popbackstack 行为在 25.1.0 和 25.1.1 中被破坏