Mik*_*nce 3 python program-entry-point python-multiprocessing
如果我有以下代码:
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
Run Code Online (Sandbox Code Playgroud)
脚本按预期运行,打印"ok!" 并结束.但是,如果我省略该if __name__=='__main__':行并去除以下行,我的机器(OS X)会发疯,不断产生大量的Python进程直到我killall Python.知道这里发生了什么吗?
(对于那些标记为重复的人,请注意,虽然另一个问题if __name__=='__main__'通常会询问目的 ,但我特别询问为什么在此处使用它会导致意外行为)
您正在禁用fork该行的支持:
billiard.forking_enable(0)
Run Code Online (Sandbox Code Playgroud)
这意味着库需要生成(而不是fork)您的子进程,并让它重新导入__main__模块以运行f,就像Windows一样.如果没有if __name__ ...后卫,重新导入__main__子代中的模块也意味着重新运行创建代码的代码billiard.Process,从而创建无限循环.
如果你保持fork启用状态,则不需要在子进程中重新导入,所以无论是否有if __name__ ...后卫,一切正常.
| 归档时间: |
|
| 查看次数: |
1622 次 |
| 最近记录: |