默然博客 - Asyncio
type: channel
link: https://moranyun.cn/tag/Asyncio/
items: Python Asyncio 实战指南：从入门到放弃再到真香

Python Asyncio 实战指南：从入门到放弃再到真香
type: item
date: 2026-03-13T12:46:00+08:00
description: Python Asyncio 实战指南：从入门到放弃再到真香引言大家好，我是默然，今天给大家分享Python异步编程的实战经验。很多Python开发者对asyncio都又爱又恨，觉得它复杂难用，坑很多，学习曲线陡峭。我当初也是从入门到放弃，后来在项目中被逼着用了几次，才慢慢体会到异步编程的好处，现在已经是真香了。今天我就用最通俗的语言，带大家搞懂asyncio，看完就能在项目中用起来。正文部分1. 什么是异步编程？我们为什么需要它？在讲asyncio之前，我们先搞清楚什么是异步编程，它能解决什么问题。我们平时写的Python代码大部分都是同步的，也就是代码一行一行顺序执行，上一行没执行完，下一行就等着。比如你要调用一个接口，网络请求需要1秒，这时候整个程序就卡住1秒，什么都干不了，只能等请求返回。如果你的程序大部分时间都在等待IO（比如网络请求、数据库查询、文件读写），那同步模式就会浪费大量的CPU时间，这时候异步编程就派上用场了。异步编程的核心思想就是：在等待IO操作的时候，程序不闲着，去干点别的事情，等IO操作完成了再回来继续处理。举个通俗的例子：同步模式：你烧水的时候站在水壶旁边等着，水开了再去泡茶，泡茶的时候等着茶泡好，再去吃早餐，整个过程要30分钟异步模式：你先把水烧上，然后去刷牙，刷完牙水刚好开了，泡上茶，然后去吃早餐，早餐吃完茶也泡好了，整个过程只需要15分钟同样的事情，异步模式效率提升了一倍！这就是异步编程的优势。2. Asyncio 核心概念快速搞懂asyncio里有几个核心概念，搞懂了这几个概念，你就理解了80%的asyncio。2.1 协程（Coroutine）协程是asyncio的基本单位，你可以把它理解成一个"可以暂停的函数"。用async def定义的函数就是协程函数：async def hello(): print("Hello") await asyncio.sleep(1) print("World")注意：直接调用协程函数不会执行，它只会返回一个协程对象，需要放到事件循环里才能执行。2.2 事件循环（Event Loop）事件循环是asyncio的核心，你可以把它理解成一个死循环，不断地检查有没有要执行的任务，有就执行，没有就等着。import asyncio # 获取事件循环 loop = asyncio.get_event_loop() # 运行协程 loop.run_until_complete(hello()) # 关闭循环 loop.close()Python 3.7+之后可以用更简单的asyncio.run()：asyncio.run(hello())2.3 Future 和 TaskFuture：代表一个异步操作的结果，还没完成的时候是pending状态，完成了是done状态Task：是Future的子类，用来包装协程，把协程放到事件循环里调度执行我们可以用asyncio.create_task()来创建任务，让多个协程并发执行：import asyncio async def task1(): await asyncio.sleep(2) print("任务1完成") async def task2(): await asyncio.sleep(1) print("任务2完成") async def main(): # 创建两个任务，并发执行 t1 = asyncio.create_task(task1()) t2 = asyncio.create_task(task2()) # 等待两个任务都完成 await t1 await t2 asyncio.run(main())运行结果：任务2完成 任务1完成两个任务总共只花了2秒，而不是3秒，这就是并发的效果！2.4 await 关键字await是用来暂停协程执行的，当你await一个协程、Task或者Future的时候，当前协程会暂停，把CPU让给其他协程，等await的对象完成了再回来继续执行。注意：await只能在async函数里面用，在普通函数里用会报错。3. 常见使用场景和示例asyncio特别适合IO密集型的任务，下面是几个常见的使用场景。3.1 并发爬取网页这是asyncio最常用的场景之一，比如你要爬取100个网页，用同步的方式要等100个请求依次完成，用异步的方式可以同时发送多个请求。我们用aiohttp这个异步HTTP库来演示：import asyncio import aiohttp async def fetch_url(session, url): try: async with session.get(url, timeout=10) as response: content = await resp…