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
相关产品推荐
相关产品推荐

