0

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

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)
4

1 回答 1

3

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

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

Trio 教程对此有更多详细信息。

不幸的是,Trio 没有注意到这一点并给你一些警告......我刚刚提交了一个问题,希望能补充一下。

另外,仅供参考,您使用队列的方式可能会使事情变得比他们需要的更复杂:-)。我不认为我曾经使用过queue.full()put_nowait并且get_nowait有一些合法用途,但它们相当罕见。对于大多数目的,您唯一需要调用的是await queue.put(value)and value = await queue.get()(或print(await queue.get()),或其他)。

于 2018-08-04T00:30:07.987 回答