![](/img/trans.png)
[英]python multiprocessing on windows, 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.