2014-06-23 11 views
7

Ich bin verwirrt über die Verwendung freeze_support() für multiprocessing und ich bekomme eine Runtime Error ohne es. Ich führe nur ein Skript aus und definiere keine Funktion oder ein Modul. Kann ich es noch benutzen? Oder die Pakete, die ich importiere, sollten es benutzt haben?Wohin mit freeze_support() in einem Python-Skript?

Here ist die Dokumentation.

Beachten Sie, dass das spezifische Problem über scikit-learn Aufruf GridSearchCV ist, die versucht, Prozesse parallel zu spawnen. Ich bin mir nicht sicher, ob mein Skript dafür eingefroren werden muss, oder der Code, der aufgerufen wird (aus der Anaconda-Distribution). Wenn Details zu dieser Frage relevant sind, gehen Sie bitte auf die genauere question.

+0

Wie wird Ihr Skript ausgeführt? – dano

+0

@dano OK, dann ist die konkrete Frage relevant. Ich habe meinen gesamten Code dort eingefügt. (Aber der Link zeigte auf die falsche Frage, ich habe es behoben.) Wird in einem speziellen Python-Interpreter (von Spyder) ausgeführt. –

Antwort

20

Auf Windows alle Ihrer multiprocessing -verwenden Code muss also durch if __name__ == "__main__":

bewacht werden, sicher zu sein, würde ich alle Ihre Code-gegenwärtig auf der obersten Ebene des Skripts in einer main() Funktion setzen und dann tut dies nur auf der obersten Ebene:

if __name__ == "__main__": 
    main() 

den „Safe Import des Hauptmoduls“ Unterabschnittes Siehe here für eine Erklärung, warum dies notwendig ist. Sie müssen wahrscheinlich freeze_support überhaupt nicht anrufen, obwohl es nichts tut, um es einzuschließen.

Beachten Sie, dass es eine bewährte Methode ist ohnehin die if __name__ == "__main__" Schutz für Skripte zu verwenden, so dass der Code nicht unerwartet ausgeführt wird, wenn Sie feststellen, müssen Sie Ihr Skript in ein anderes Skript in der Zukunft irgendwann import.

+0

Klingt gut, danke, ich werde dich wissen lassen, wie es gelaufen ist, und dann bin ich froh zu akzeptieren. –

+2

Das einzige Szenario, das nicht behandelt wird, ist, wenn jemand ein Objekt erstellt, das von Process erbt, d. H.: Class myProcess (Process), wo setzen Sie dann freeze_support in diesem Szenario? – Har