欢迎光临
我们一直在努力

Python中为什么主进程创建子进程的代码块需要写在“if __name__ == ‘__main__‘:下

Python中为什么主进程创建子进程的代码块需要写在“if name == ‘main’:下

文章目录

  • Python中为什么主进程创建子进程的代码块需要写在“if __name__ == '__main__':下
  • 一、核心原因(Windows 下必加,Linux/Mac 建议统一写法)
  • 二、原理详解
  • 三、错误示例(会出问题)
  • 四、正确写法(标准规范)
  • 五、补充说明

一、核心原因(Windows 下必加,Linux/Mac 建议统一写法)

Python 多进程默认使用 spawn 启动方式(Windows 默认),子进程会重新导入当前模块,如果不放在 if name == ‘main’: 里,会造成无限递归创建进程、程序报错崩溃。

二、原理详解

  • 模块导入机制 Python 脚本有两种运行状态:

    1.直接运行脚本:此时 name = ‘main’ 2.被其他文件导入:此时 name = 模块名

  • 多进程 spawn 模式的执行流程(Windows)

    1.主进程运行代码,创建子进程 2.子进程会独立启动 Python 解释器,并重新 import 你的当前脚本 3.如果创建子进程的代码不在 if name == ‘main’: 内部: 子进程导入脚本时,会再次执行创建子进程的代码 不断新建进程 → 无限递归、进程爆炸、程序卡死 / 报错

  • 三、错误示例(会出问题)

    import multiprocessing

    # 直接写在全局,没有判断
    def task():
    print("子进程运行")

    # 问题代码:全局创建进程
    p = multiprocessing.Process(target=task)
    p.start()
    p.join()

    运行后果: Windows 下直接报错、无限创建子进程,程序无法正常运行。

    四、正确写法(标准规范)

    import multiprocessing

    def task():
    print("子进程运行")

    # 只有当前脚本是主程序时,才执行创建进程逻辑
    if __name__ == '__main__':
    p = multiprocessing.Process(target=task)
    p.start()
    p.join()

    逻辑:

    主进程运行:__name__ == '__main__' → 执行创建子进程
    子进程导入模块:__name__ != '__main__' → 跳过创建进程代码,只加载函数,不会递归新建进程

    五、补充说明

    1.Linux / Mac
    默认使用 fork 方式创建子进程,不会重新导入模块,不加这句暂时能跑。
    但跨平台兼容、代码规范要求必须加上。
    2.总结一句话
    Windows 下多进程会重新导入模块,把创建进程的代码放到 if __name__ == '__main__': 中,可以避免子进程重复创建新进程,防止无限递归。

    赞(0)
    未经允许不得转载:171主机测评 » Python中为什么主进程创建子进程的代码块需要写在“if __name__ == ‘__main__‘:下
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址