我正在使用 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
的苗圃与生成器或迭代器一起使用,请同时展示一个示例。