предположим, у меня есть 2 функции-генератора обработки:
Код: Выделить всё
def gen1(): # just for examples,
yield 1 # yields actually carry
yield 2 # different computation weight
yield 3 # in my case
def gen2():
yield 4
yield 5
yield 6
Код: Выделить всё
from itertools import chain
mix = chain(gen1(), gen2())
Код: Выделить всё
def mix_yield():
for item in mix:
yield item
Мой вопрос: как я могу сделать эквивалент в асинхронном коде?
Потому что мне это нужно, чтобы:
- вернуть доходность (один за другим) или со следующим итератором
- сначала самый быстрый разрешенный выходной результат (асинхронный)
После экспериментов и исследований я нашел библиотеку aiostream, которая заявлена как асинхронная версия itertools, и что я сделал:
Код: Выделить всё
import asyncio
from aiostream import stream
async def gen1():
await asyncio.sleep(0)
yield 1
await asyncio.sleep(0)
yield 2
await asyncio.sleep(0)
yield 3
async def gen2():
await asyncio.sleep(0)
yield 4
await asyncio.sleep(0)
yield 5
await asyncio.sleep(0)
yield 6
a_mix = stream.combine.merge(gen1(),gen2())
async def a_mix_yield():
for item in a_mix:
yield item
Код: Выделить всё
TypeError: 'merge' object is not an iterator
Код: Выделить всё
raise StreamEmpty()
Код: Выделить всё
print(await stream.list(a_mix))
# [1, 2, 4, 3, 5, 6]
- возврат в доходности (один за другим) или с помощью следующего итератора
– сначала выполняется самый быстрый выход (асинхронный)
Подробнее здесь: https://stackoverflow.com/questions/534 ... generators
Мобильная версия