asyncio队列的奇怪行为

时间:2017-12-24 15:32:00

标签: queue python-3.6 python-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

2 个答案:

答案 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()   方法

     

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

来自Python Coroutines doc

在Mikhail Gerasimov的例子中, 使用coroutine async def main()的另一个await coroutine来电q.put(100),并且事件循环正在运行loop.run_until_complete(main()),例如以上说明。