为什么台球多处理模块需要"if __name __ =='__ main__'"行?

Mik*_*nce 3 python program-entry-point python-multiprocessing

如果我有以下代码:

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
Run Code Online (Sandbox Code Playgroud)

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

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

dan*_*ano 6

您正在禁用fork该行的支持:

billiard.forking_enable(0)
Run Code Online (Sandbox Code Playgroud)

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

如果你保持fork启用状态,则不需要在子进程中重新导入,所以无论是否有if __name__ ...后卫,一切正常.