如果我有以下代码:
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__':
行并取消以下行的缩进,我的机器(OSX)就会变得疯狂,不断生成大量Python进程,直到我killall Python
。知道这里发生了什么吗?
(对于那些将其标记为重复的人,请注意,虽然另一个问题通常询问if __name__=='__main__'
的目的,但我特别询问为什么在这里不使用它会导致显著的意外行为)
您使用以下行禁用fork
支持:
billiard.forking_enable(0)
这意味着库将需要派生(而不是派生)您的子进程,并让它重新导入__main__
模块以运行f
,就像Windows一样。如果没有if __name__ ...
保护,在子级中重新导入__main__
模块也意味着重新运行创建billiard.Process
的代码,这将创建一个无限循环。
如果启用fork
,则不需要在子进程中重新导入,因此无论是否使用if __name__ ...
保护,一切都可以正常工作。