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

Python子进程为何在执行目标函数前运行脚本代码?

问题原因及解决方案

这是因为子进程启动时会重新执行/导入整个脚本,如果你的打印PID代码没有放在if __name__ == '__main__':的判断块里,子进程就会执行这段代码,导致输出子进程的PID。

具体原理

  • 在Linux/macOS这类Unix系统中,multiprocessing默认用fork模式:子进程会复制父进程的内存空间,但会从fork的位置继续执行,脚本里的顶级代码(不在if __name__块内的)也会被子进程执行。
  • 在Windows系统中,multiprocessing默认用spawn模式:会启动全新的Python解释器,重新导入你的脚本,此时脚本里所有顶级代码都会被执行一遍。

不管哪种模式,只有放在if __name__ == '__main__':里的代码,才会只有主进程(脚本直接运行时)执行,子进程启动时__name__的值不是__main__,所以不会执行这部分代码。

修复示例

错误写法(导致子进程执行额外代码)

import multiprocessing
import os

# 子进程启动时会执行这段代码
print(f"当前进程PID: {os.getpid()}")

def worker():
    print(f"Worker函数执行,PID: {os.getpid()}")

if __name__ == '__main__':
    p = multiprocessing.Process(target=worker)
    p.start()
    p.join()

正确写法(仅主进程执行专属代码)

import multiprocessing
import os

def worker():
    print(f"Worker函数执行,PID: {os.getpid()}")

if __name__ == '__main__':
    # 只有主进程会执行这里的代码
    print(f"主进程PID: {os.getpid()}")
    p = multiprocessing.Process(target=worker)
    p.start()
    p.join()

这样修改后,输出就只会包含主进程PID和worker函数的内容,符合你的预期。

内容的提问来源于stack exchange,提问作者zhangyonguu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:45:40