为何Python多进程中同一段代码会在主进程与子进程均执行?
为什么子进程Process-1会执行输出
sl的代码? 这是Windows系统下multiprocessing模块的启动机制导致的,核心原因如下:
- Windows没有类Unix系统的
fork调用,创建子进程时会重新加载整个脚本文件(相当于子进程会把当前脚本当作模块导入执行)。 - 你代码里的
print("sl",multiprocessing.process.current_process().name)处于全局作用域,不在if __name__ == '__main__':代码块内。当子进程启动时,会执行脚本里所有不在__main__判断内的代码,因此这行print会被子进程执行,输出sl Process-1。
完整执行流程拆解
主进程执行流程:
- 导入脚本里的所有模块。
- 进入
if __name__ == '__main__':代码块,创建子进程t1并启动。 - 打印
s2 MainProcess。 - 退出
__main__代码块后,执行全局的print("sl"...),输出sl MainProcess。
子进程执行流程:
- 子进程启动时重新加载
test.py,此时子进程的__name__不是__main__,所以不会执行if __name__ == '__main__':里的代码。 - 执行全局作用域的所有代码,包括最后那行
print("sl"...),输出sl Process-1。 - 最后执行子进程的目标函数
func,输出任务开始和结束的信息。
- 子进程启动时重新加载
解决方法
如果不想让子进程执行这行打印代码,只需把它移到if __name__ == '__main__':代码块内即可:
if __name__ == '__main__': t1 = Process(target=func, args=('first', 11)) t1.start() print("s2",multiprocessing.process.current_process().name) print("sl",multiprocessing.process.current_process().name) # 移到这里
内容的提问来源于stack exchange,提问作者Afrey
相关产品推荐
相关产品推荐

