joblib 文档包含以下警告:
在 Windows 下,保护代码的主循环以避免在使用 joblib.Parallel 时递归生成子进程非常重要。换句话说,您应该编写如下代码:
import .... def function1(...): ... def function2(...): ... ... if __name__ == '__main__': # do stuff with imports and functions defined about ...
任何代码都不应在“if __name__ == '__main__'”块之外运行,只能在导入和定义之外运行。
最初,我认为这只是为了防止偶尔出现的奇怪情况,即函数传递给joblib.Parallel
递归调用模块,这意味着这通常是一种很好的做法,但通常是不必要的。但是,这对我来说没有意义,为什么这只会在 Windows 上存在风险。此外,这个答案似乎表明未能保护主循环导致代码运行速度比其他非常简单的非递归问题慢几倍。
出于好奇,我从 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 实现需要在每种情况下都保护主循环吗?
抱歉,如果这是一个超级基本的问题。我是并行化世界的新手,所以我可能只是遗漏了一些基本概念,但我在任何地方都找不到明确讨论的这个问题。
最后,我想指出,这纯粹是学术性的;我理解为什么以这种方式编写代码通常是一种好习惯,并且将继续这样做,而不管 joblib。