3

如果我有以下代码:

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 进程,直到 I killall Python. 知道这里发生了什么吗?

(对于那些将其标记为重复的人,请注意,虽然另一个问题 if __name__=='__main__'一般是问目的,但我特意问的是为什么未能在此处使用它会导致出乎意料的行为)

4

1 回答 1

8

您正在禁用fork对以下行的支持:

billiard.forking_enable(0)

这意味着该库将需要生成(而不是 fork)您的子进程,并让它重新导入__main__要运行的模块f,就像 Windows 一样。如果没有if __name__ ...警卫,重新导入__main__子模块中的模块也意味着重新运行创建 的代码billiard.Process,这会创建一个无限循环。

如果您fork保持启用状态,则无需在子进程中重新导入,因此无论有无if __name__ ...防护,一切都可以正常工作。

于 2014-10-31T17:56:14.927 回答