def sample():
pass
Process(target=sample).start()
Process(target=sample).start()
上述代码失败并显示错误:
已尝试在当前之前启动新进程 进程已完成其自举阶段。这可能意味着 你没有使用fork启动你的子进程而你有 忘记在主模块中使用正确的习语
但是这段代码运行良好:
def sample():
pass
if __name__ == '__main__':
Process(target=sample).start()
Process(target=sample).start()
在这种情况下,为什么主模块会影响我的代码执行?我无法正确理解错误消息。
注意:我经历了What does if __name__ == "__main__": do?,但无法理解其与我的代码的相关性。
答案 0 :(得分:5)
创建新子进程时,子进程可能(主要取决于您使用的操作系统)重新导入当前模块。
在您的情况下,重新导入模块也会执行以下两行:
Process(target=sample).start()
Process(target=sample).start()
以及会发生什么,错误消息告诉您:
在当前进程完成其自举阶段之前,已尝试启动新进程。这可能意味着您没有使用fork启动子进程,而您忘记在主模块中使用正确的习惯用法
在为第一个子进程设置适当的环境时,代码会尝试分叉另一个子进程。经理检测到这一点并告诉你这不行。
if __name__ == '__main__':
Process(target=sample).start()
Process(target=sample).start()
是保护条件,它允许在子模块中导入当前模块而不会出现此问题,因为只有--well--主模块的名称为{{1} }。