我无法让异步生成器或迭代器实际异步运行

问题描述 投票:0回答:0

我正在使用 BigQuery 的异步存储写入 API。它广泛地与异步生成器和迭代器配合使用,我以前没有使用过它们。不幸的是,我没有得到任何 async 方面的工作。

我退后一步,以便更好地理解异步生成器。我对

trio
最满意,但似乎
trio
的核心
open_nursery
功能不适用于生成器。所以我创建了最简单的生成器,只是为了让我的头脑了解它:

>>> import trio
>>> async def generator():
...   for i in range(10):
...     await trio.sleep(random.random())
...     yield i
... 
>>> async def main():
...   async for idx in generator():
...     print(idx)
... 
0
1
2
3
4
5
6
7
8
9
>>> trio.run(main)

这就是它按顺序运行的方式。打印数字之间的暂停长度会改变,但它始终同步运行:生成器仅在等待后才产生一个值,并且

async for
仅在给出前一个产量后才会移动到下一个值。

这不是我所期望的,也不是我需要或希望的。我期望所有的“作业”都会立即触发,所有的打印语句都会无序地随机发生,并且整个过程将花费不到 1 秒的时间。 (

random.random()
的范围在 0 到 1 之间。)


我如何以真正异步的方式使用异步生成器和迭代器,以便所有任务都尽可能快地调度,并且它们“并行”运行?

(我知道事实上我只使用一个处理器和一个线程,但是,例如,

trio.sleep()
应该提供一个检查点来表明另一个任务可以启动,因为它是空闲的。)

请提供一个玩具代码示例,例如,使用我的生成器并以真正并行的方式运行它。如果有一种方法可以将

trio
的苗圃与生成器或迭代器一起使用,请同时展示一个示例。

python asynchronous iterator generator
© www.soinside.com 2019 - 2024. All rights reserved.