8

明確にするために更新された質問:

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イテレータを使用して返す

    - 最速で解決された利回りが最初 (非同期)

4

2 に答える 2