一、什么是异步迭代器?
实现了 __aiter__() 和 __anext__() 方法的对象。__anext__ 必须返回一个 awaitable对象。async for 会处理异步迭代器的 __anext__() 方法所返回的可等待对象,直到其引发一个 StopAsyncIteration 异常。
二、实例
class AsyncIterable:
def __init__(self, iterable):
self.iterable = iterable
def __aiter__(self):
return self
async def __anext__(self):
if not self.iterable:
raise StopAsyncIteration
return self.iterable.pop(0)
async def main():
async for i in AsyncIterable([1, 2, 3, 4, 5]):
await asyncio.sleep(1)
print(i)
asyncio.run(main())
在这个例子中,AsyncIterable是一个异步迭代器,它每次产生一个元素,并在产生每个元素后等待1秒。
另一个例子
import asyncio
class Reader(object):
""" 自定义异步迭代器(同时也是异步可迭代对象) """
def __init__(self):
self.count = 0
async def readline(self):
# await asyncio.sleep(1)
self.count += 1
if self.count == 10:
return None
return self.count
def __aiter__(self):
return self
async def __anext__(self):
val = await self.readline()
if val == None:
raise StopAsyncIteration
return val
async def func():
# 创建异步可迭代对象
async_iter = Reader()
# async for 必须要放在async def函数内,否则语法错误。
async for item in async_iter:
print(item)
asyncio.run(func())
参考:
【python】async异步编程_python async_ynliii的博客-CSDN博客
https://baijiahao.baidu.com/s?id=1769488614922759759&wfr=spider&for=pc