同步和异步
故事的背景
Python 可以写多线程,但常见的 CPython 受 GIL 影响,同一时刻通常只有一个线程在执行 Python 字节码。所以对 CPU 密集型任务来说,它不擅长靠线程把多个核心全部跑满,可简单理解为Python通常单线程。

同步模式很好理解:代码按顺序执行,上一行没结束,下一行就不能开始。这种方式简单直观,但遇到耗时操作时会阻塞后面的代码。比如:
- 用户点击按钮后,界面长时间无响应
- 一个网络请求没返回,整个程序都停在那里
- CPU 明明空闲,却只能等 IO 完成
问题的关键是:很多耗时并不是在“计算”,而是在“等待”。等待网络、文件、数据库时,CPU 其实可以先去做别的事。
而异步(Asynchronous)解决的就是这个问题:遇到需要等待的任务,先挂起它,转头处理别的事情;等结果准备好了,再回来继续。

其实,人本身既像多线程,也像异步。你想想平时:你点了外卖后,不会一直站在门口等;而是继续刷手机、聊天。等外卖到了,再回来处理外卖。这其实就是“异步”:遇到耗时任务,先不傻等,去做别的事,等结果回来再继续。而你还能同时聊天、听歌、思考事情,这又有点像“多线程”。
哪些可异步
异步适合“耗时,但不需要 CPU 一直盯着”的任务,例如网络请求、文件读写、数据库查询、定时等待等。它们的共同点是:任务本身不难算,主要时间都花在等结果。
下面这段代码里,请求发出后,程序不会一直卡在原地,而是先执行后面的代码,最后再通过 await task 等结果。
异步的底层实现
异步的核心是 Event Loop(事件循环)。它负责决定:哪个任务先跑,哪个任务先挂起,哪个任务可以恢复。比如:
执行到 await 时,如果结果还没准备好,事件循环会挂起当前任务,先去执行别的任务。等网络数据返回后,再回到刚才暂停的位置继续执行。所以异步不是让单个任务本身变快,而是让程序在等待期间别闲着。
在 Python 里,异步任务不会自己运行,必须交给事件循环管理,asyncio.run() 会启动事件循环,它会调度任务、挂起任务、恢复任务,并等待 IO 事件完成:
asyncio 是 Python 官方提供的异步模块,其他常见异步方案还有:trio、curio、twisted、gevent

