RuntimeError unter Windows beim Versuch der Python-Mehrfachverarbeitung

| | | | | | | | | | | | | | | | | | | |

Ich versuche mein allererstes formelles Python-Programm mit Threading und Multiprocessing auf einem Windows-Rechner. Ich kann die Prozesse jedoch nicht starten, da Python die folgende Meldung ausgibt. Die Sache ist die, dass ich meine Threads nicht im Modul main starte. Die Threads werden in einem separaten Modul innerhalb einer Klasse behandelt.

EDIT: Übrigens läuft dieser Code gut auf Ubuntu. Nicht ganz unter Windows

Laufzeitfehler: Versuch, einen neuen Prozess zu starten, bevor der aktuelle Prozess seine Bootstrapping-Phase beendet hat. Dies bedeutet wahrscheinlich, dass Sie unter Windows arbeiten und vergessen haben, das richtige Idiom im Hauptmodul zu verwenden: if __name__ == "__main__": freeze_support() ... Die Zeile "freeze_support()" kann weggelassen werden, wenn das Programm dies tut wird nicht eingefroren, um eine ausführbare Windows-Datei zu erstellen. 

Mein ursprünglicher Code ist ziemlich lang, aber ich konnte den Fehler in einer gekürzten Version des Codes reproduzieren. Es ist in zwei Dateien aufgeteilt, die erste ist das Hauptmodul und tut kaum etwas anderes, als das Modul zu importieren, das Prozesse/Threads behandelt und eine Methode aufruft. Das zweite Modul ist das Kernstück des Codes.


testMain.py:

import parallelTestModule extractor = parallelTestModule.ParallelExtractor () extractor.runInParallel(numProcesses=2, numThreads=4) 

parallelTestModule.py:

import multiprocessing from multiprocessing import Process import threading class ThreadRunner(threading.Thread): """ Diese Klasse stellt eine einzelne Instanz eines laufenden Threads dar""" def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): print self.name," " class ProcessRunner: """ Diese Klasse repräsentiert eine einzelne Instanz eines laufenden Prozesses """ def runp(self, pid, numThreads): mythreads = [] for tid in range(numThreads): name = "Proc-"+str(pid)+"-Thread-"+str(tid) th = ThreadRunner(name) mythreads.append(th) für i in mythreads: i.start() für i in mythreads: i.join() class ParallelExtractor: def runInParallel(self, numProcesses, numThreads): myprocs = [] prunner = ProcessRunner() für pid in range(numProcesses): pr = Process(target=prunner.runp, args=(pid, numThreads)) myprocs.append(pr) # if __name__ == "parallelTestModule": #Das hat nicht funktioniert # if __name__ == "__main__": #Das funktioniert offensichtlich nicht # multiprocessing.freeze_support() #Hinzugefügt, nachdem ich einen Fehler ohne Erfolg für i in myprocs gesehen habe: i.start() für i in myprocs: i.join ()