ОБНОВЛЕННЫЙ ВОПРОС ДЛЯ ЯСНОСТИ:
предположим, у меня есть 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
Я могу связать их с помощью itertools
from itertools import chain
mix = chain(gen1(), gen2())
и затем я могу создать другой объект функции генератора с ним,
def mix_yield():
for item in mix:
yield item
или просто, если я просто хочу next(mix)
, он есть.
Мой вопрос таков:Как я могу сделать эквивалент в асинхронном коде?
Потому что мне нужно:
- возврат в yield (один за другим), или с
next
итератор - самый быстрый разрешенный доход первым (асинхронный)
ПРЕД.ОБНОВЛЕНИЕ:
После экспериментов и исследований я обнаружил библиотеку 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
, но явсе еще не могу сделать next(a_mix)
TypeError: 'merge' object is not an iterator
или next(await a_mix)
raise StreamEmpty()
Хотя я все еще могу сделать это в списке:
print(await stream.list(a_mix))
# [1, 2, 4, 3, 5, 6]
такодна цель достигнута, еще одна должна пройти: