fork复制父进程内存(Unix/Linux/macOS),启动快但有线程/资源竞争风险;spawn新建解释器(全平台),启动慢但安全可预测,Windows/macOS默认使用。
Python 的 fork 与 spawn 是 multiprocessing 模块中两种不同的进程启动方式,核心差异在于子进程的创建机制和初始化行为,直接影响程序兼容性、性能和跨平台表现。
fork 仅在 Unix/Linux/macOS 系统可用,调用操作系统 fork() 系统调用,直接复制父进程的整个内存地址空间(采用写时复制,COW),子进程立即拥有与父进程一致的代码、数据、打开的文件描述符和运行状态。
fork 后子进程只保留 fork 调用时刻的主线程,其他线程状态被丢弃,容易导致死锁(例如 GIL 锁或 pthread mutex 处于加锁状态)spawn 在所有平台(包括 Windows)均支持。它启动一个全新的 Python 解释器进程,重新导入主模块(即执行 if __name__ == '__main__': 块),从头开始初始化所有模块和全局状态。
这是由操作系统能力决定的:Windows 没有 fork() 系统调用,因此 multiprocessing 在 Windows 和 macOS(10.14+ 默认 spawn)上强制或倾向使用 spawn。可通过 multipro 或 
'fork' 显式指定(需在主模块入口处、if __name__ == '__main__': 内尽早调用)。
spawn 可提升跨平台一致性,减少环境差异引发的 bugfork 可优化 Unix 下的启动性能,但需确保代码无 fork 不安全操作(如提前开启线程、使用 multiprocessing.Queue 以外的共享对象)fork 有兼容性限制(如涉及 objc runtime),spawn 更稳妥没有绝对优劣,关键看你的程序结构和部署环境:
spawn,避免因平台切换导致行为突变fork 可降低开销spawn
logging.basicConfig()、torch.set_num_threads())应确保其幂等,或移入子进程专用函数中