【问题标题】:Weird behaviour of asyncio Queue异步队列的奇怪行为
【发布时间】:2017-12-24 15:32:00
【问题描述】:
为什么 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
【问题讨论】:
标签:
queue
python-3.6
python-asyncio
【解决方案1】:
因为你什么都没放:
q.put(100)
put 这里 - 不是一个普通的函数,它是一个coroutine。你shouldawait它把项目放入队列中。
例如:
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()
【解决方案2】:
作为 Mikhail Gerasimov 的回答,q.put(100) 是 coroutine 并解释更多细节......
调用协程不会启动其代码运行——协程
调用返回的对象在您安排它之前不会做任何事情
执行。启动它有两种基本方法:调用 await
coroutine 或 yield from coroutine 从另一个协程(假设
其他协程已经在运行!),或者使用
ensure_future() 函数或 AbstractEventLoop.create_task()
方法。
协程(和任务)只能在事件循环运行时运行。
来自Python Coroutines doc。
在米哈伊尔·格拉西莫夫的例子中,
另一个coroutine async def main() 用coroutine q.put(100) 调用await 并且事件循环正在运行loop.run_until_complete(main()),如上面的描述。