文章最后更新时间:
【免责声明:本文由AI辅助生成,内容仅供参考,不构成专业建议。】
Python异步编程实战:asyncio/aiohttp/await异步编程完全指南
异步编程是现代Python开发的重要技能。本文从基础概念到实战应用,完整讲解Python异步编程。
异步编程基础
同步vs异步:同步编程按顺序执行,一个任务完成前不会开始下一个。异步编程允许任务切换,提升效率。
阻塞vs非阻塞:阻塞调用会等待结果返回,非阻塞调用立即返回不等待。
协程(Coroutine):可暂停和恢复执行的函数。使用async def定义。
事件循环(Event Loop):调度协程执行的机制。asyncio.get_event_loop()获取。
asyncio核心概念
async/await:async定义协程函数,await等待协程结果。async def hello(): await asyncio.sleep(1) print(“world”)
创建任务:asyncio.create_task()创建并发任务。asyncio.gather()并行运行多个协程。
Task管理:asyncio.Task封装协程。Task.cancel()取消任务,Task.result()获取结果。
超时控制:asyncio.wait_for()设置超时。asyncio.timeout()在Python 3.11+提供。
aiohttp异步HTTP
aiohttp是Python异步HTTP客户端和服务端库。import aiohttp async with aiohttp.ClientSession() as session: async with session.get(url) as resp: data = await resp.json()
并发请求:使用asyncio.gather()并发发送多个请求。async def fetch_all(urls): tasks = [fetch(session, url) for url in urls] return await asyncio.gather(*tasks)
连接池:TCPConnector配置连接池参数。limit控制总连接数,limit_per_host控制单主机连接数。
错误处理:try-except捕获异常。aiohttp.ClientError是基础异常类。
异步数据库
aiomysql:异步MySQL驱动。async with aiomysql.create_pool() as pool: async with pool.acquire() as conn。
asyncpg:异步PostgreSQL驱动。性能优于psycopg2。async with asyncpg.create_pool() as pool: rows = await pool.fetch()
aiosqlite:异步SQLite支持。async with aiosqlite.connect(db) as db: await db.execute()
Redis异步:aioredis提供异步Redis支持。async with aioredis.create_redis() as redis。
实战最佳实践
连接复用:使用连接池复用连接,减少连接开销。aiohttp.ClientSession应复用而非每次请求创建。
并发控制:使用Semaphore控制并发数,避免过多并发导致资源耗尽。semaphore = asyncio.Semaphore(10)。
取消处理:优雅处理任务取消。使用try-await asyncio.shield()保护关键任务不被取消。
调试技巧:使用asyncio.ensure_future()创建任务以便调试。设置PYTHONASYNCIODEBUG=1开启调试模式。
异步vs多线程/多进程
异步:适合IO密集型任务。单线程内并发,开销小。无法利用多核CPU。
多线程:适合IO密集和部分CPU密集任务。GIL限制Python执行。有线程切换开销。
多进程:适合CPU密集型任务。绕过GIL,可利用多核CPU。进程间通信开销大。
更多技术文章:https://blog.hanyucloud.com | 客服:400-880-3980

















暂无评论内容