如果我有以下代码:
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__'
的目的,但我明确地询问为什么在此处使用它会导致意外行为?
答案 0 :(得分:6)
您正在使用以下行禁用fork
支持:
billiard.forking_enable(0)
这意味着库需要生成(而不是fork)您的子进程,并让它重新导入__main__
模块以运行f
,就像Windows一样。如果没有if __name__ ...
后卫,重新导入子项中的__main__
模块也意味着重新运行创建billiard.Process
的代码,这将创建无限循环。
如果您启用fork
,则无需在子进程中重新导入,因此无论有没有if __name__ ...
后卫,一切正常。