2015-06-17 10 views
8

Ich habe eine Klassenfunktion (nennen wir es "alpha.py"), die Multiprocessing (Prozesse = 2) verwendet, um einen Prozess zu forktieren und ist Teil eines Python-Pakets, das ich geschrieben habe. In einem separaten Python-Skript (nennen wir es "beta.py") habe ich ein Objekt aus dieser Klasse instanziiert und die entsprechende Funktion aufgerufen, die Multiprocessing verwendet. Schließlich ist all dies in ein Wrapper-Python-Skript eingebettet (nennen wir es "gamma.py"), das viele verschiedene Klassenobjekte und Funktionen behandelt.Python Multiprocessing RuntimeError unter Windows

wesentlichen in Betracht:

  1. Run ./gamma.py von der Befehlszeile
  2. gamma.py verwendet Subprozess und führt beta.py
  3. beta.py ein Objekt aus der Klasse instanziiert alpha.py und ruft die Funktion auf, die Multiprocessing verwendet (Prozesse = 2)

Dies hat keine Probleme, auf einem Mac oder Linux ausgeführt werden. Es wird jedoch ein Problem auf einem Windows-Rechner und den Fehler (und Dokumentation) schlägt vor, dass ich diese irgendwo schreiben soll:

if __name__ == '__main__': 
    freeze_support() 

This other post erwähnt auch das gleiche tun.

Allerdings weiß ich nicht genau, wo diese beiden Zeilen liegen sollten. Derzeit enthält weder alpha.py, beta.py noch gamma.py einen Abschnitt if __name__ == '__main__':. Es wäre großartig, wenn mir jemand sagen könnte, wohin diese zwei Zeilen gehen sollten und auch die Gründe dahinter.

+0

Können Sie eine Fehlermeldung erhalten, die Sie damit bekommen? Stapelverfolgung? Hast du das gelöst? Ich bin überrascht, dass es keine Antwort darauf gab. –

Antwort

2

Tatsächlich wird freeze_support() hier nicht benötigt. Sie erhalten eine RuntimeError, weil Sie Ihre neuen Prozesse auf der obersten Ebene Ihres Moduls beta erstellen und starten.

Wenn ein neuer Prozess mit multiprocessing unter Windows erstellt wird, wird ein neuer Python-Interpreter in diesem Prozess gestartet und es wird versucht, das Modul mit der Zielfunktion zu importieren, die ausgeführt werden soll. Dies ist Ihr beta Modul. Jetzt, wenn Sie es importieren, sollten alle Ihre Top-Level-Anweisungen ausgeführt werden, was dazu führen wird, dass ein neuer Prozess erstellt und erneut gestartet wird. Und dann, rekursiv, ein weiterer Prozess von diesem Prozess und so weiter und so fort.

Dies ist höchstwahrscheinlich nicht das, was Sie wollen, daher sollten neue Prozesse nur einmal initialisiert und gestartet werden, wenn Sie beta.py direkt mit einem subprocess ausführen.

if __name__ == '__main__': sollte in beta.py platziert werden, dann verschieben Sie die Initialisierung und starten Sie den Code für Ihre neuen Prozesse in diesem Abschnitt. Wenn beta.py dann importiert wird und nicht direkt ausgeführt wird, wird kein neuer Prozess gestartet und Sie sehen keine Nebenwirkungen.