为什么这个多处理代码失败了?

时间:2015-12-11 12:23:44

标签: python

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?,但无法理解其与我的代码的相关性。

1 个答案:

答案 0 :(得分:5)

创建新子进程时,子进程可能(主要取决于您使用的操作系统)重新导入当前模块。

在您的情况下,重新导入模块也会执行以下两行:

Process(target=sample).start()
Process(target=sample).start()

以及会发生什么,错误消息告诉您:

  

在当前进程完成其自举阶段之前,已尝试启动新进程。这可能意味着您没有使用fork启动子进程,而您忘记在主模块中使用正确的习惯用法

在为第一个子进程设置适当的环境时,代码会尝试分叉另一个子进程。经理检测到这一点并告诉你这不行。

if __name__ == '__main__':
    Process(target=sample).start()
    Process(target=sample).start()

保护条件,它允许在子模块中导入当前模块而不会出现此问题,因为只有--well--主模块的名称为{{1} }。