为什么九球多进程模块需要 "if __name__=='__main__'" 语句?

3
如果我有以下代码:
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__' 的用途,但我特别询问为什么在此处不使用它会导致极其意外的行为。)

据推测,当运行“台球”时,它会导入你的代码,如果没有防护措施,这会导致“台球”再次运行,并导入你的模块,从而导致“台球”再次运行,进而循环下去... - jonrsharpe
1个回答

8

你正在使用以下代码行禁用fork支持:

billiard.forking_enable(0)

这意味着库将需要生成(而不是fork)您的子进程,并重新导入__main__模块以运行f,就像Windows一样。如果没有if __name__ ...保护,那么在子进程中重新导入__main__模块也意味着重新运行创建billiard.Process的代码,从而创建一个无限循环。
如果保留启用fork,则子进程中的重新导入不是必需的,因此使用或不使用if __name__ ...保护都可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接