Почему важно защищать основной цикл при использовании joblib.Parallel?

Документы 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

Мой вопрос А как насчет реализации Windows JobLib требует, чтобы основной цикл был защищен в каждом случае?

Извиняюсь, если это супер основной вопрос. Я новичок в мире распараллеливания, так что, может быть, мне просто не хватает некоторых базовых понятий, но я нигде не смог найти этот вопрос в явном виде

Наконец, я хочу отметить, что это чисто академический характер; Я понимаю почему этокак правило, хорошая практика написать свой код таким образом, и будет продолжать делать это независимо от JobLib.

Ответы на вопрос(1)

Ваш ответ на вопрос