异步编程是现代编程中不可或缺的一部分。Python 3.5 引入的 async/await 语法让异步代码写起来像同步代码一样直观。
什么是异步编程
异步编程是一种非阻塞的编程方式。当程序需要等待 I/O 操作(如网络请求、文件读写)完成时,不需要停下来等待,而是可以先去做其他事情,等操作完成后再回来处理结果。
基本语法
定义协程
使用 async def 定义一个协程函数:
async def fetch_data(url):
response = await aiohttp.get(url)
return await response.json()
运行协程
使用 asyncio.run() 来运行顶层的协程:
import asyncio
async def main():
data = await fetch_data("https://api.example.com")
print(data)
asyncio.run(main())
并发执行
使用 asyncio.gather() 可以并发执行多个协程:
async def main():
urls = ["url1", "url2", "url3"]
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks)
return results
这样三个请求会同时发出,总耗时约等于最慢的那个请求,而不是三个请求时间的总和。
实际应用场景
- 网络爬虫:并发抓取多个页面,大幅提升效率
- Web 服务器:如 FastAPI、Sanic 等框架基于异步编程
- 数据库操作:异步数据库驱动如 asyncpg、motor
注意事项
异步编程虽然强大,但也有需要注意的地方:
- 不要在异步代码中使用同步的 I/O 操作,会阻塞事件循环
- 注意协程的异常处理,一个协程的异常可能导致 gather 整体失败
- 合理控制并发数量,避免对目标服务器造成过大压力
异步编程是 Python 进阶的必经之路,掌握它将让你的程序更高效、更优雅。

发表回复