gpt4 book ai didi

python - 为什么台球多处理模块需要 "if __name__==' __main_ _'"行?

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:55 25 4
gpt4 key购买 nike

如果我有以下代码:

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__ ... 守卫,重新导入子模块中的 __main__ 模块也意味着重新运行创建 billiard.Process< 的代码,这会创建一个无限循环。

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

关于python - 为什么台球多处理模块需要 "if __name__==' __main_ _'"行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26680686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com