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()方法安排执行。
协程(和任务)只能在事件循环运行时运行。
在Mikhail Gerasimov的例子中,另一个coroutine
async def main()
用await
coroutine
调用q.put(100)
,并且事件循环正在运行loop.run_until_complete(main())
,如上面的描述。
以上是关于asyncio队列的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段