为什么台球多处理模块需要"if __name__=='__main__"行?



如果我有以下代码:

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__':行并取消以下行的缩进,我的机器(OSX)就会变得疯狂,不断生成大量Python进程,直到我killall Python。知道这里发生了什么吗?

(对于那些将其标记为重复的人,请注意,虽然另一个问题通常询问if __name__=='__main__'的目的,但我特别询问为什么在这里不使用它会导致显著的意外行为)

您使用以下行禁用fork支持:

billiard.forking_enable(0)

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

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

相关内容

  • 没有找到相关文章

最新更新