我想使用生成器yield和async函数。我阅读了本主题,并编写了以下代码:
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”
如何在异步功能中使用良率生成器?
更新:
从Python 3.6开始,我们有了异步生成器,能够yield直接在协程内部使用。
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在协程内部。唯一的方法是使用/ magic方法手动实现异步迭代器。在您的情况下:__aiter__``__anext__
__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())
输出:
0 1 4