Python内置函数 aiter() 用于获取异步可迭代对象的异步迭代器,是异步编程中的核心工具之一。
1. 基本概念
异步可迭代对象:实现了 __aiter__() 和 __anext__() 方法的对象,支持 async for 循环。
异步迭代器:通过 aiter() 获取的对象,每次调用 anext() 会返回一个 awaitable 对象(通常为协程),解析后得到下一个值或触发终止。
2. 语法与参数
aiter(async_iterable)
参数: async_iterable 必须是实现了异步迭代协议的对象(如异步生成器、异步迭代器类)。
返回值:异步迭代器对象,支持 anext() 方法。
3. 使用场景
(1) 手动迭代异步生成器
import asyncio
async def async_generator():
for i in range(3):
await asyncio.sleep(1)
yield i
async def main():
# 获取异步迭代器
async_iter = aiter(async_generator())
# 手动调用 anext()
try:
print(await anext(async_iter)) # 输出: 0
print(await anext(async_iter)) # 输出: 1
except StopAsyncIteration:
print("迭代结束")
asyncio.run(main())
输出:
0
1
迭代结束
(2) 结合 async for 循环
async def main():
async for value in async_generator():
print(value) # 自动调用 aiter() 和 anext()
4. 自定义异步迭代器
通过实现 __aiter__() 和 __anext__() 方法:
class AsyncCounter:
def __init__(self, max_num):
self.max = max_num
self.current = 0
async def __aiter__(self):
return self
async def __anext__(self):
if self.current < self.max:
await asyncio.sleep(1) # 模拟异步操作
self.current += 1
return self.current
else:
raise StopAsyncIteration
# 使用示例
async def main():
async for num in AsyncCounter(3):
print(num) # 输出: 1, 2, 3(间隔1秒)
5. 注意事项
异步上下文限制
aiter() 和 anext() 必须在 async def 函数或异步上下文中使用,普通同步代码会报错。
与 iter() 的区别
iter() 用于同步可迭代对象, aiter() 专用于异步场景。
anext() 对应 next() ,但需通过 await 解析。
嵌套事件循环问题
在Jupyter Notebook等已运行事件循环的环境中,需使用 nest_asyncio 库:
6. 常见错误
TypeError: 'aiter' object is not iterable
原因:未使用 async for 或未正确调用 anext() 。
StopAsyncIteration未被捕获
需在 try-except 块中处理迭代终止。
总结
aiter() 是异步编程中迭代异步数据流的核心工具,与 anext() 配合使用可实现非阻塞的逐项处理。其设计优化了I/O密集型任务的效率,适用于网络请求、文件流处理等场景。实际开发中建议优先使用 async for 简化代码逻辑 。