Python异步编程核心是asyncio,通过协程和事件循环实现单线程并发,适用于I/O密集型任务;协程需用async/await定义与调用,必须由事件循环调度执行;事件循环是调度中心,asyncio.run()自动管理;并发用gather或create_task;CPU密集型任务需配合executor,须使用异步兼容库,避免同步阻塞操作。
Python异步编程的核心是 asyncio,它通过协程(coroutine)和事件循环(event loop)实现单线程并发,特别适合 I/O 密集型任务,比如网络请求、文件读写、数据库查询等。关键不是“多线程”,而是“让出控制权”,避免等待时的空转。
协程函数用 async def 声明,调用后返回一个协程对象,**不会立即执行**。必须交给事件循环运行,或用 await 在另一个协程中等待。
my_coro() 只得到一个协程对象,不运行;await my_coro() 只能在 async 函数内部 使用;asyncio.run(my_coro()) 启动事件循环并运行协程。事件循环是 asyncio 的核心运行时,负责注册、调度和执行协程、回调、定时任务等。日常开发中大多不需要手动创建,asyncio.run() 会自动创建、运行并关闭它。
loop = asyncio.get_event_loop()(注意 Python 3.11+ 推荐用 asyncio.get_running_loop());run() 会各自新建循环;await asyncio.sleep()。要同时发起多个异步任务,不能简单用 await
串行等待,而应并发调度。
await asyncio.gather(coro1(), coro2(), coro3()):批量等待多个协程,全部完成才返回结果列表;task = asyncio.create_task(coro()):立即调度协程为任务(Task 对象),适合需要提前启动、后续再 await 的场景;asyncio.wait() 等待任意完成或超时。异步不是万能的,用错反而降低性能甚至引发错误。
loop.run_in_executor() 丢给线程池或进程池;aiohttp 替代 requests,aiomysql 替代 PyMySQL);