TRIO Lib 队列获取和放置
TRIO Lib queue get and put
您好,我正在尝试将 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)
您的问题是您正在使用 time.sleep
。如果您将对 time.sleep(...)
的两个调用都替换为对 await trio.sleep(...)
的调用,那么您的示例有效。
Trio 与所有异步库一样,只能在您使用 await
的地方切换任务。这意味着你永远不应该使用像 time.sleep
这样的阻塞同步函数——相反你需要使用 Trio 提供的异步版本,比如 trio.sleep
。在你的代码中,你根本没有任何 await
s,所以无论哪个任务首先发生在 运行 上,都会永远保持 运行ning,并且永远不会给其他任务机会 运行.
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())
,或其他)。
您好,我正在尝试将 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)
您的问题是您正在使用 time.sleep
。如果您将对 time.sleep(...)
的两个调用都替换为对 await trio.sleep(...)
的调用,那么您的示例有效。
Trio 与所有异步库一样,只能在您使用 await
的地方切换任务。这意味着你永远不应该使用像 time.sleep
这样的阻塞同步函数——相反你需要使用 Trio 提供的异步版本,比如 trio.sleep
。在你的代码中,你根本没有任何 await
s,所以无论哪个任务首先发生在 运行 上,都会永远保持 运行ning,并且永远不会给其他任务机会 运行.
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())
,或其他)。