TRIO Lib队列获取和放置

时间:2018-08-03 21:09:08

标签: python-3.x python-trio

您好,我正在尝试将Trio与两个异步功能以及两者之间的消息一起使用。但是它并没有启动消费者,我也不真正明白为什么。生产者在“队列”中发送良好,一旦饱和就不发送任何东西。但是消费者并没有为此而努力。还是我做错了?预先谢谢你

import time

import trio
async def producer(queue):
    while True:
        time.sleep(1)
        if queue.full() is False:
            queue.put_nowait(1)
            print(queue.full())
            print('put')

async def consumer(queue):
    while True:
        time.sleep(4)
        if queue.full() is True:
            print(queue.get_nowait())
            print(queue.full())
        print('get')

async def main():

    queue = trio.Queue(capacity=4)
    async with trio.open_nursery() as nursery:
        # Two producers
        nursery.start_soon(consumer, queue)
        nursery.start_soon(producer, queue)

trio.run(main)

1 个答案:

答案 0 :(得分:2)

您的问题是您使用的是time.sleep。如果您将对time.sleep(...)的两个调用都替换为对await trio.sleep(...)的调用,那么您的示例将起作用。

Trio与所有异步库一样,只能在使用await的地方在任务之间切换。这意味着您永远不应使用阻塞同步功能,例如time.sleep –相反,您需要使用Trio提供的异步版本,例如trio.sleep。在您的代码中,您根本没有任何await,因此,碰巧最先运行的任务将永远运行,而永远不会给其他任务运行的机会。

Trio tutorial has more details on this

不幸的是,Trio没有注意到这一点,并给了您一些警告...我只是filed an issue希望加进来。

此外,仅供参考,您使用队列的方式可能会使事情变得比需要的复杂得多:-)。我认为我从未使用过queue.full(),并且put_nowaitget_nowait有一些合理的用途,但它们很少见。在大多数情况下,您只需调用await queue.put(value)value = await queue.get()(或print(await queue.get())或其他任何东西)即可。