Python Multiprocessing RuntimeError unter Windows

8

Ich habe eine Klassenfunktion (nennen wir sie "alpha.py"), die Multiprocessing (processes = 2) verwendet, um einen Prozess zu forschen 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.

Im Wesentlichen:

  1. Führen Sie ./gamma.py von der Befehlszeile
  2. aus
  3. gamma.py verwendet den Subprozess und führt beta.py
  4. aus
  5. beta.py instanziiert ein Objekt aus der alpha.py-Klasse und ruft die Funktion auf, die Multiprocessing (processes = 2) verwendet

Dies hat keine Probleme, auf einem Mac oder Linux ausgeführt zu werden. Es wird jedoch ein Problem auf einem Windows-Computer und der Fehler (und die Dokumentation) schlägt vor, dass ich das irgendwo schreiben sollte:

%Vor%

In diesem anderen Post wird auch erwähnt, dass das getan wird Gleiche Sache.

Allerdings weiß ich nicht genau, wo diese zwei Zeilen liegen sollten. Derzeit enthalten weder alpha.py, beta.py oder gamma.py noch 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.

    
slaw 17.06.2015, 01:01
quelle

1 Antwort

2

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

Wenn ein neuer Prozess unter Verwendung von multiprocessing unter Windows erstellt wird, wird ein neuer Python-Interpreter in diesem Prozess gestartet und 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 anderer Prozess von diesem Prozess, und so weiter.

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.

    
wombatonfire 12.09.2016 22:14
quelle