【问题标题】:Why does the billiard multiprocessing module require the "if __name__=='__main__'" line?为什么台球多处理模块需要“if __name__=='__main__'”行?
【发布时间】:2014-10-31 17:52:51
【问题描述】:

如果我有以下代码:

def f():
    print 'ok!'
    import sys
    sys.exit()

if __name__=='__main__':
    import billiard
    billiard.forking_enable(0)
    p = billiard.Process( target=f)
    p.start()
    while p.is_alive():
        pass

脚本按预期运行,打印“ok!”和结束。但是如果我省略if __name__=='__main__': 行并取消缩进以下行,我的机器(OS X)就会发疯,不断产生大量Python 进程,直到我killall Python。知道这里发生了什么吗?

(对于那些将其标记为重复的人,请注意,虽然另一个问题通常询问 if __name__=='__main__' 的用途,但我特意问的是为什么在此处未使用它会导致严重的意外行为)

【问题讨论】:

  • 推测,billiard 在运行时正在导入您的代码,这(如果省略了守卫)会导致billiard 再次运行,导入您的模块,导致billiard 再次运行,导入。 ..

标签: python main python-multiprocessing


【解决方案1】:

您正在禁用fork 支持:

billiard.forking_enable(0)

这意味着库需要生成(而不是 fork)您的子进程,并让它重新导入 __main__ 模块以运行 f,就像 Windows 一样。如果没有if __name__ ... 保护,在子级中重新导入__main__ 模块也意味着重新运行创建billiard.Process 的代码,这会创建一个无限循环。

如果您启用fork,则无需在子进程中重新导入,因此无论有没有if __name__ ... 保护,一切都可以正常工作。

【讨论】:

    猜你喜欢
    • 2018-11-22
    相关资源
    最近更新 更多