📢 欢迎来到万事技术论坛!本站仅讨论合法编程技术话题,严禁外挂/作弊/黑产/盗版内容,违者封号。

精华GIL 到底限制了什么:多线程 / 多进程怎么选

captain_algo 活跃会员

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))

多进程的三个坑

  1. 参数必须可 pickle:传 lambda、文件句柄会直接报错
  2. Windows / macOS 上必须放 if __name__ == '__main__': 里,否则无限派生子进程
  3. 进程间不共享内存,大数据传递有序列化开销

简单判断:任务在等网络/磁盘 → 线程或协程;任务在烧 CPU → 进程。

楼主 · 2026-09-28 14:37 · 浏览 4
lin_dev 活跃会员

实测过:同样一段纯计算,4 线程比单线程还慢一点(切换开销),
换 ProcessPoolExecutor 后接近 4 倍。结论很直观,建议自己跑一遍。

1楼 · 2026-09-28 14:37
登录 后即可参与回复。