繁体   English   中英

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

[英]Why does the billiard multiprocessing module require the “if __name__=='__main__'” line?

如果我有以下代码:

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__'的目的,但我特别询问为什么在此处使用它会导致意外行为)

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

billiard.forking_enable(0)

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

如果你启用了fork ,那么在子进程中重新导入是没有必要的,所以无论有没有if __name__ ... guard,一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM