You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python multiprocessing代码Linux正常运行macOS报__name__ == '__main__'相关错误

问题原因分析

你遇到的报错是MacOS系统Python 3.8+版本的多进程默认启动规则变更导致的,具体如下:

  • Linux环境下Python多进程默认使用fork启动模式:该模式会直接复制父进程的运行时内存,子进程不需要重新导入主模块,因此就算进程池创建逻辑没有加保护块也不会重复执行,不会触发报错。
  • Windows和MacOS Python 3.8+默认使用spawn启动模式:该模式下子进程会启动全新的Python解释器,重新导入整个主模块代码。如果你的进程池创建、任务提交逻辑没有被if __name__ == '__main__'包裹,导入时会再次执行创建进程池的代码,形成无限递归的启动逻辑,最终触发你看到的RuntimeError。
    你反馈Windows环境可以正常运行,大概率是Windows环境的代码运行场景隐式满足了保护条件,比如代码封装在函数内部调用、在交互式终端逐行执行等。
修复方案

方案1(推荐,全平台兼容)

将所有多进程相关的启动逻辑全部放入if __name__ == '__main__'的保护块中即可,示例如下:

from multiprocessing import Pool
import os

# 你的任务函数定义放在保护块外
def compute_task(param):
    # 任务逻辑
    return param * 2

if __name__ == '__main__':
    # 进程池创建、任务提交、结果处理逻辑全部放在这个块内
    ncpus = os.cpu_count()
    pool = Pool(processes=ncpus)
    results = pool.map(compute_task, range(100))
    print(results)
    pool.close()
    pool.join()

如果你需要将脚本打包为可执行文件,在保护块的第一行加上freeze_support()即可,普通运行无需添加该行。

方案2(临时兼容,仅MacOS可用)

如果不想修改现有代码结构,可以在创建进程池之前手动指定多进程启动方式为fork,和Linux行为对齐:

import multiprocessing
# 放在所有多进程逻辑之前
multiprocessing.set_start_method('fork', force=True)

注意该方案存在潜在兼容性风险,部分依赖系统底层框架的代码在fork模式下可能出现异常崩溃,优先使用方案1。

内容的提问来源于stack exchange,提问作者Adam G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:09:04