【问题标题】:TRIO Lib queue get and putTRIO Lib 队列获取和放置
【发布时间】:2018-08-04 08:30:07
【问题描述】:

您好,我正在尝试将三重奏与两个异步函数和一条消息一起使用。但它并没有推出消费者,我真的不明白为什么。生产者在“队列”中发送良好,一旦饱和就不会发送任何内容。但消费者并不买账。还是我犯了一个错误?提前谢谢你

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)

【问题讨论】:

    标签: python-3.x python-trio


    【解决方案1】:

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

    Trio 与所有异步库一样,只能在您使用 await 的地方在任务之间切换。这意味着你永远不应该使用像time.sleep 这样的阻塞同步函数——相反,你需要使用 Trio 提供的异步版本,比如 trio.sleep。在您的代码中,您根本没有任何 awaits,因此无论哪个任务恰好先运行,都会一直运行下去,并且永远不会给另一个任务运行的机会。

    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()),或其他)。

    【讨论】:

    • 冻糕,谢谢。 Je 包括 mieux 维护人员。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2021-12-15
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多