【发布时间】:2016-09-29 17:03:42
【问题描述】:
我想使用生成器 yield 和 async 函数。我读了this topic,然后写了下一段代码:
import asyncio
async def createGenerator():
mylist = range(3)
for i in mylist:
await asyncio.sleep(1)
yield i*i
async def start():
mygenerator = await createGenerator()
for i in mygenerator:
print(i)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(start())
except KeyboardInterrupt:
loop.stop()
pass
但我得到了错误:
SyntaxError: 'yield' inside async function
如何在异步函数中使用yield generator?
【问题讨论】:
-
这可能吗?这似乎是两种相反的设计。除非需要,否则生成器不会产生价值,这意味着它们原则上需要处理具有状态。另一方面,
async表明被调用的函数不能依赖于它的状态。否则你将有数据竞争。支持异步生成器似乎真的很麻烦,它们需要用锁定机制包装。因此,您的问题的答案可能就在这个方向。 -
您能否返回一个 Future 对象,然后在您需要它的数据时生成该对象。我从来没有使用过 asyncio,但 Tornado 就是这样做的。
-
我认为异步生成器没有任何意义。您应该能够从异步函数返回生成器。您有什么想要实现的目标,还是只是在尝试?
-
可以使用事件吗? createGenerator 将被设置事件,并且 start 将是等待事件。我写了this solution。这是工作,但我想要更好的代码。
-
@Ильдар 你看到第二个答案了吗?你怎么想的?看起来有效。
标签: python yield python-3.5 python-asyncio