在现代Python编程中,Python异步生成器是一个强大而优雅的工具,它结合了异步编程(async/await)和生成器(generator)的优点,特别适用于处理大量I/O密集型任务,如网络请求、文件读写或数据库查询。本教程将从基础概念讲起,一步步带你掌握async def、async for 和 yield 的配合使用,即使是编程新手也能轻松上手。
普通生成器使用 yield 关键字来逐个返回值,而异步生成器则是在 async def 函数中使用 yield,使得每次生成值的过程可以是异步的(比如等待网络响应)。你可以用 async for 来遍历它。

普通生成器:
def simple_generator(): for i in range(3): yield i# 使用for value in simple_generator(): print(value)异步生成器:
import asyncioasync def async_generator(): for i in range(3): await asyncio.sleep(0.1) # 模拟异步操作 yield i# 使用async def main(): async for value in async_generator(): print(value)asyncio.run(main())注意:必须使用 async for 来遍历异步生成器,不能用普通的 for 循环。
假设你正在从多个网页抓取数据。如果用同步方式,每个请求都要等前一个完成才能开始,效率极低。而使用Python异步生成器,你可以在等待某个请求完成的同时,发起其他请求,极大提升性能。
import asyncioimport aiohttpasync def fetch_urls(urls): async with aiohttp.ClientSession() as session: for url in urls: async with session.get(url) as response: html = await response.text() yield html # 异步生成网页内容async def main(): urls = [ 'https://httpbin.org/delay/1', 'https://httpbin.org/delay/1', 'https://httpbin.org/delay/1' ] async for page in fetch_urls(urls): print("页面长度:", len(page))asyncio.run(main())在这个例子中,fetch_urls 是一个异步生成器,它逐个获取网页内容并 yield 出来。虽然代码看起来是顺序执行,但由于使用了 await,底层事件循环会自动调度其他任务,实现并发效果。
async for —— 必须在 async def 函数内。next() 调用 —— 必须用 async for 或手动调用 __anext__()(不推荐)。async with 上下文管理(如果需要资源清理)。return 提前结束生成器,但不会返回值(Python规定生成器的 return 值会被忽略)。你可以将多个异步生成器组合使用。例如,一个生成器负责读取文件行,另一个负责处理每行数据:
async def read_lines(filename): with open(filename, 'r') as f: for line in f: await asyncio.sleep(0.01) # 模拟 I/O 延迟 yield line.strip()async def process_lines(filename): async for line in read_lines(filename): if line: yield line.upper()async def main(): async for processed in process_lines('data.txt'): print(processed)asyncio.run(main())通过本教程,你应该已经掌握了 Python异步生成器 的核心概念和使用方法。记住三个关键点:
async def 定义函数;yield 返回值;async for 遍历结果。异步生成器是构建高性能、可读性强的异步程序的重要工具。无论你是开发Web爬虫、API服务还是数据管道,掌握 async for 和 yield from(注:在异步上下文中通常直接用 yield 而非 yield from)的配合使用,都能让你的代码更优雅高效。
提示:Python 3.6+ 才支持异步生成器。确保你的环境版本符合要求。
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129373.html