我想使用生成器产量和异步函数。我读这个话题 https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python,并编写了下一个代码:
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
但我收到错误:
语法错误:异步函数内的“yield”
如何在异步函数中使用收益生成器?
Upd:
从 Python 3.6 开始,我们有异步发电机 https://www.python.org/dev/peps/pep-0525/并能够使用yield
直接在协程内部。
import asyncio
async def async_generator():
for i in range(3):
await asyncio.sleep(1)
yield i*i
async def main():
async for i in async_generator():
print(i)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens()) # see: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.shutdown_asyncgens
loop.close()
Python 3.5 的旧答案:
你不能yield
在协程内部。唯一的办法就是落实异步迭代器 https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for手动使用__aiter__
/__anext__
魔法方法。在你的情况下:
import asyncio
class async_generator:
def __init__(self, stop):
self.i = 0
self.stop = stop
async def __aiter__(self):
return self
async def __anext__(self):
i = self.i
self.i += 1
if self.i <= self.stop:
await asyncio.sleep(1)
return i * i
else:
raise StopAsyncIteration
async def main():
async for i in async_generator(3):
print(i)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Output:
0
1
4
这里还有两个例子:1 https://stackoverflow.com/a/36094436/1113207, 2 https://stackoverflow.com/a/37286577/1113207
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)