gpt4 book ai didi

python - 在 Python 中加入多个异步生成器

转载 作者:行者123 更新时间:2023-12-04 22:26:55 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





asynchronous python itertools chain multiple generators

(2 个回答)


2年前关闭。




我想监听来自同一对象的多个实例的事件,然后将此事件流合并到一个流中。例如,如果我使用异步生成器:

class PeriodicYielder: 
def __init__(self, period: int) -> None:
self.period = period

async def updates(self):
while True:
await asyncio.sleep(self.period)
yield self.period

我可以成功监听来自一个实例的事件:
async def get_updates_from_one(): 
each_1 = PeriodicYielder(1)
async for n in each_1.updates():
print(n)
# 1
# 1
# 1
# ...

但是我怎样才能从多个异步生成器中获取事件呢?换句话说:我如何按照它们准备好生成下一个值的顺序遍历多个异步生成器?
async def get_updates_from_multiple(): 
each_1 = PeriodicYielder(1)
each_2 = PeriodicYielder(2)
async for n in magic_async_join_function(each_1.updates(), each_2.updates()):
print(n)
# 1
# 1
# 2
# 1
# 1
# 2
# ...

有没有这样的 magic_async_join_function 在 stdlib 或第 3 方模块中?

最佳答案

你可以用精彩aiostream图书馆。它看起来像这样:

import asyncio
from aiostream import stream


async def test1():
for _ in range(5):
await asyncio.sleep(0.1)
yield 1


async def test2():
for _ in range(5):
await asyncio.sleep(0.2)
yield 2


async def main():
combine = stream.merge(test1(), test2())

async with combine.stream() as streamer:
async for item in streamer:
print(item)


asyncio.run(main())

结果:
1
1
2
1
1
2
1
2
2
2

关于python - 在 Python 中加入多个异步生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55299564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com