Warum ist es wichtig, die Hauptschleife bei der Verwendung von joblib.Parallel zu schützen?

Die JobLib-Dokumente enthalten die folgende Warnung:

Unter Windows ist es wichtig, die Hauptschleife des Codes zu schützen, um ein rekursives Auftreten von Unterprozessen bei der Verwendung von joblib.Parallel zu vermeiden. Mit anderen Worten, Sie sollten Code wie folgt schreiben:

import ....

def function1(...):
    ...

def function2(...):
    ...

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

Kein Code sollte außerhalb der "if __name__ ==‘ __main__ ’" -Blöcke ausgeführt werden, nur Importe und Definitionen.

Zunächst nahm ich an, dass dies nur dazu diente, um den gelegentlichen, ungewöhnlichen Fall zu verhindern, dass eine Funktion an @ übergeben wurdjoblib.Parallel hat das Modul rekursiv aufgerufen, was bedeuten würde, dass es sich im Allgemeinen um eine bewährte Methode handelt, die jedoch häufig nicht erforderlich ist. Es macht für mich jedoch keinen Sinn, warum dies nur unter Windows ein Risiko darstellt. Zusätzlich,diese Antwort scheint darauf hinzudeuten, dass der Fehler beim Schutz der Hauptschleife dazu führte, dass der Code mehrmals langsamer ausgeführt wurde, als dies ansonsten für ein sehr einfaches, nicht rekursives Problem der Fall gewesen wäre.

Aus Neugier führte ich das supereinfache Beispiel einer peinlich parallelen Schleife aus den JobLib-Dokumenten aus, ohne die Hauptschleife auf einer Windows-Box zu schützen. Mein Terminal war mit folgendem Fehler überladen, bis ich es schloss:

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

Meine Frage ist Wie sieht es mit der Windows-Implementierung von joblib aus, wenn die Hauptschleife in jedem Fall geschützt sein muss?

Entschuldigung, wenn dies eine super grundlegende Frage ist. Ich bin neu in der Welt der Parallelisierung, daher fehlen mir möglicherweise einige grundlegende Konzepte, aber ich konnte dieses Problem nirgendwo explizit diskutieren.

Zum Schluss möchte ich festhalten, dass dies rein akademisch ist; Ich verstehe, warum es @ iallgemein gute Praxis, um seinen Code auf diese Weise zu schreiben, und wird dies auch weiterhin tun, unabhängig von der Jobbibliothek.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage