您好,我正在尝试将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)
答案 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_nowait
和get_nowait
有一些合理的用途,但它们很少见。在大多数情况下,您只需调用await queue.put(value)
和value = await queue.get()
(或print(await queue.get())
或其他任何东西)即可。