明確にするために更新された質問:
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 で返す (1 つずつ)、または
next
イテレータを使用して返す - 最速で解決された利回りが最初 (非同期)
前へ アップデート:
実験と調査の結果、 itertools の非同期バージョンとして記述されているaiostreamライブラリを見つけたので、次のことを行いました。
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]
1 つの目標が達成され、あと 1 つの目標が達成されました。
yield で返す (1 つずつ)、または
next
イテレータを使用して返す- 最速で解決された利回りが最初 (非同期)