gpt4 book ai didi

python - 为什么在使用 joblib.Parallel 时保护主循环很重要?

转载 作者:IT老高 更新时间:2023-10-28 20:54:16 32 4
gpt4 key购买 nike

joblib 文档包含以下警告:

Under Windows, it is important to protect the main loop of code to avoid recursive spawning of subprocesses when using joblib.Parallel. In other words, you should be writing code like this:

import ....

def function1(...):
...

def function2(...):
...

... if __name__ == '__main__':
# do stuff with imports and functions defined about
...

No code should run outside of the “if __name__ == ‘__main__’” blocks, only imports and definitions.

最初,我认为这只是为了防止偶尔出现的奇怪情况,即传递给 joblib.Parallel 的函数递归地调用模块,这意味着这通常是一种很好的做法,但通常是不必要的。但是,这对我来说没有意义,为什么这只会在 Windows 上存在风险。此外,this answer似乎表明未能保护主循环导致代码运行速度比其他非常简单的非递归问题慢几倍。

出于好奇,我从 joblib 文档中运行了一个令人尴尬的并行循环的 super 简单示例,而没有保护 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 基本的问题。我是并行化领域的新手,所以我可能只是遗漏了一些基本概念,但我找不到任何地方明确讨论过这个问题。

最后,我想指出,这纯粹是学术性的;我明白为什么是generally good practice以这种方式编写自己的代码,并将继续这样做,而不管 joblib。

最佳答案

这是必要的,因为 Windows 没有 fork()。由于这个限制,Windows 需要在它产生的所有子进程中重新导入您的 __main__ 模块,以便在子进程中重新创建父进程的状态。这意味着如果您有在模块级别生成新进程的代码,它将在所有子进程中递归执行。 if __name__ == "__main__" 守卫用于防止模块范围内的代码在子进程中重新执行。

这在 Linux 上不是必需的,因为它确实具有 fork(),这允许它派生一个保持与父进程相同状态的子进程,而无需重新导入 __main__ 模块。

关于python - 为什么在使用 joblib.Parallel 时保护主循环很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29545605/

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