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

时间:2014-10-31 17:52:52

标签: python main 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

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

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

1 个答案:

答案 0 :(得分:6)

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

billiard.forking_enable(0)

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

如果您启用fork,则无需在子进程中重新导入,因此无论有没有if __name__ ...后卫,一切正常。

相关问题