【问题标题】: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()),如上面的描述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 2015-12-29
        • 1970-01-01
        • 2020-07-28
        • 2017-05-13
        • 2017-09-13
        相关资源
        最近更新 更多