GIL(全局解释器锁)让同一时刻只有一个线程执行 Python 字节码。
所以多线程没用了?
分情况看:
- CPU 密集(计算、图像处理、压缩)→ 多线程几乎无加速,要用多进程
- IO 密集(网络请求、文件读写、数据库)→ 多线程有效,因为等 IO 时会释放 GIL
怎么选
| 场景 | 方案 |
|---|---|
| CPU 密集 | multiprocessing / ProcessPoolExecutor |
| IO 密集、并发量大 | asyncio |
| IO 密集、并发量小 | ThreadPoolExecutor |
| 简单并行跑几个任务 | concurrent.futures |
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as ex:
results = list(ex.map(cpu_heavy, data))
多进程的三个坑
- 参数必须可 pickle:传 lambda、文件句柄会直接报错
- Windows / macOS 上必须放
if __name__ == '__main__':里,否则无限派生子进程 - 进程间不共享内存,大数据传递有序列化开销
简单判断:任务在等网络/磁盘 → 线程或协程;任务在烧 CPU → 进程。
楼主 · 2026-09-28 14:37 · 浏览 4

