python多进程可绕过gil实现cpu密集型任务的真正并行,需用multiprocessing模块、合理设置进程数、注意跨平台spawn机制及进程间通信方式。

Python 的 GIL(全局解释器锁)会限制多线程在 CPU 密集型任务中的并行执行,但多进程可以真正利用多核 CPU,绕过 GIL 的限制。核心思路是:用多个独立的 Python 进程代替线程,每个进程拥有自己的解释器和内存空间,互不干扰。
使用 multiprocessing 模块启动独立进程
这是最直接、最常用的方案。multiprocessing 提供了与 threading 高度兼容的接口,但底层启动的是子进程而非线程。
- 用 Process 类创建并启动新进程,目标函数在新进程中运行,不受 GIL 影响
- 用 Pool 管理进程池,适合批量处理同构任务(如对大量数据做相同计算)
- 注意:进程间不共享内存,传参需序列化(支持 pickle 的对象),返回值也需反序列化
合理选择进程数量
不是越多越好。过多进程会带来调度开销和内存占用,通常建议设为 os.cpu_count() 或略高(如 +1~2),尤其在 I/O 和 CPU 混合任务中可适度超量。
- CPU 密集型任务:进程数 ≈ 物理核心数(避免频繁上下文切换)
- 含较多 I/O 的任务:可略多于核心数(I/O 等待时其他进程可继续执行)
- 可通过 multiprocessing.cpu_count() 获取系统核心数
进程间通信与数据共享
多进程天然隔离,如需协作,需显式通信。常用方式有:
立即学习“Python免费学习笔记(深入)”;
- Queue / Pipe:安全传递数据,适合生产者-消费者模型(Queue 是线程/进程安全的)
- Value / Array:共享简单的 ctypes 类型变量或数组(需加锁保护写操作)
- Manager:提供更高级的共享对象(如 dict、list),但性能较低,适合小量控制信息同步
注意 Windows 下的 spawn 启动方式
Windows 默认使用 spawn 方式启动子进程(macOS/Linux 默认 fork),这意味着子进程会重新导入主模块。若主模块顶层有可执行代码,可能意外重复运行。
- 务必把进程创建逻辑放在 if __name__ == '__main__': 保护块内
- 避免在模块顶层调用 Process().start() 或 Pool()
- spawn 更安全但启动稍慢;Linux/macOS 可用 fork,更快但有潜在状态继承问题










