joblib文档包含以下警告:
最初,我认为这只是为了防止偶尔出现的奇怪情况,在这种情况下,递归地传递给joblib.Parallel
的函数称为模块,这意味着这通常是一种好习惯,但通常是不必要的。但是,对我而言,这仅是Windows上的风险为什么并没有意义。此外,this answer似乎表明,保护主循环失败导致代码运行速度比否则非常简单的非递归问题要慢几倍。
出于好奇,我运行了来自joblib文档的令人尴尬的并行循环的超简单示例,而没有保护Windows框上的主循环。直到我关闭了终端,我的终端都被以下错误消息充斥:
ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not suppo
rt forking. To use parallel-computing in a script, you must protect you main loop using "if __name__ == '__main__'". Ple
ase see the joblib documentation on Parallel for more information
我的问题是,怎么在Joblib的Windows实现中保护主循环?
抱歉,这是一个 super 基本的问题。我是并行化 Realm 的新手,所以我可能只是缺少一些基本概念,但是我找不到在任何地方明确讨论过的问题。
最后,我想指出的是,这纯粹是学术上的;我了解为什么以这种方式编写自己的代码是generally good practice,并且无论joblib如何都将继续这样做。
最佳答案
这是必需的,因为Windows没有fork()
。由于此限制,Windows需要在它产生的所有子进程中重新导入__main__
模块,以便在子进程中重新创建父进程的状态。这意味着,如果您具有在模块级别生成新进程的代码,它将在所有子进程中递归执行。 if __name__ == "__main__"
保护用于防止模块范围内的代码在子进程中重新执行。
这在Linux上不是必需的,因为它确实具有fork()
,这使它可以派生一个与父进程保持相同状态的子进程,而无需重新导入__main__
模块。
关于python - 为什么在使用joblib.Parallel时保护主循环很重要?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29545605/