RuntimeError op Windows probeert python multiprocessing

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

Ik probeer mijn allereerste formele python-programma met Threading en Multiprocessing op een Windows-machine. Ik kan de processen echter niet starten, terwijl python het volgende bericht geeft. Het probleem is dat ik mijn threads niet start in de hoofd-module. De threads worden afgehandeld in een aparte module binnen een klasse.

EDIT: Trouwens, deze code werkt prima op ubuntu. Niet helemaal op Windows

RuntimeError: Poging om een nieuw proces te starten voordat het huidige proces de opstartfase heeft voltooid. Dit betekent waarschijnlijk dat u Windows gebruikt en bent vergeten het juiste idioom in de hoofdmodule te gebruiken: if __name__ == "__main__": freeze_support() ... De regel "freeze_support()" kan worden weggelaten als het programma niet zal worden bevroren om een uitvoerbaar Windows-bestand te produceren. 

Mijn originele code is vrij lang, maar ik heb de fout kunnen reproduceren in een verkorte versie van de code. Het is opgesplitst in twee bestanden, de eerste is de hoofdmodule en doet heel weinig anders dan de module importeren die processen/threads afhandelt en een methode aanroept. De tweede module is waar het vlees van de code is.


testMain.py:

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

parallelTestModule.py:

import multiprocessing van multiprocessing import Procesimport threading-klasse ThreadRunner(threading.Thread): """ Deze klasse vertegenwoordigt een enkele instantie van een actieve thread""" def __init__(self, name): threading.Thread.__init__(self) self.name = naam def run(self): print self.name," " class ProcessRunner: """ Deze klasse vertegenwoordigt een enkele instantie van een actief proces """ def runp(self, pid, numThreads): mythreads = [] voor tid in range(numThreads): name = "Proc-"+str(pid)+"-Thread-"+str(tid) th = ThreadRunner(name) mythreads.append(th) for i in mythreads: i.start() voor i in mythreads: i.join() class ParallelExtractor: def runInParallel(self, numProcesses, numThreads): myprocs = [] prunner = ProcessRunner() voor pid in range(numProcesses): pr = Process(target=prunner.runp, args=(pid, numThreads)) myprocs.append(pr) # if __name__ == "parallelTestModule": #Dit werkte niet # if __name__ == "__main__": #Dit werkt duidelijk niet # multiprocessing.freeze_support() #toegevoegd na het zien van een fout zonder resultaat voor i in myprocs: i.start() voor i in myprocs: i.join ()