为什么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
答案 0 :(得分:3)
因为你没有放任何东西:
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()
答案 1 :(得分:0)
正如米哈伊尔·格拉西莫夫的回答,q.put(100)
是coroutine
,并解释了更多细节......
调用协程不会启动其代码运行 - 协程 调度返回的对象在您安排它之前不会执行任何操作 执行。启动它有两种基本方法:call await 协程或来自另一个协程的协程的产量(假设 其他协同程序已在运行!),或使用安排执行 ensure_future()函数或AbstractEventLoop.create_task() 方法
协程(和任务)只能在事件循环运行时运行。
在Mikhail Gerasimov的例子中,
使用coroutine
async def main()
的另一个await
coroutine
来电q.put(100)
,并且事件循环正在运行loop.run_until_complete(main())
,例如以上说明。