【发布时间】:2020-06-11 01:00:29
【问题描述】:
澄清的更新问题:
假设我有 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),它就在那里。
我的问题是,我怎样才能在异步代码中做同样的事情?
因为我需要它:
- 返回收益(一个一个),或使用
next迭代器 - 最快解决的产量优先(异步)
上一个。更新:
经过实验和研究,我发现aiostream library 声明为 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]
所以一个目标完成了,还有一个目标:
-
返回收益(一个一个),或使用
next迭代器- 最快解决的 yield first (async)
【问题讨论】:
-
您上面的代码只是创建了几个生成器并遍历它们。因此,为什么您会看到它们按顺序打印。您可以先遍历 gen2,它会打印 4、5、6、1、2、3。也许你应该找一个不同的例子来展示你想要做什么。
-
在我的情况下 gen1() 和 gen2() 不是同时产生的,我会更新我的问题,我认为已经用 aiostream 找到了答案(我希望)。
-
抱歉给大家带来了困惑,为了清楚起见,我更新了问题。
标签: python python-3.x asynchronous python-asyncio sequence-generators