RuntimeError sur Windows essayant le multitraitement python

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

J'essaie mon tout premier programme python formel utilisant Threading et Multiprocessing sur une machine Windows. Cependant, je ne parviens pas à lancer les processus, python donnant le message suivant. Le fait est que je ne lance pas mes discussions dans le module main. Les threads sont gérés dans un module séparé à l'intérieur d'une classe.

EDIT : Au fait, ce code fonctionne correctement sur Ubuntu. Pas tout à fait sous Windows

RuntimeError : Tentative de démarrage d'un nouveau processus avant que le processus en cours n'ait terminé sa phase d'amorçage. Cela signifie probablement que vous êtes sous Windows et que vous avez oublié d'utiliser le bon idiome dans le module principal : if __name__ == "__main__": freeze_support() ... La ligne "freeze_support()" peut être omise si le programme est ne va pas être gelé pour produire un exécutable Windows. 

Mon code d'origine est assez long, mais j'ai pu reproduire l'erreur dans une version abrégée du code. Il est divisé en deux fichiers, le premier est le module principal et ne fait rien d'autre que d'importer le module qui gère les processus/threads et appelle une méthode. Le deuxième module est l'endroit où se trouve la viande du code.


testMain.py :

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

parallelTestModule.py :

importer multiprocessing from multiprocessing import Process import threading class ThreadRunner(threading.Thread): """ Cette classe représente une seule instance d'un thread en cours d'exécution""" def __init__(self, name): threading.Thread.__init__(self) self.name = nom def run(self): print self.name," " class ProcessRunner: """ Cette classe représente une seule instance d'un processus en cours d'exécution """ def runp(self, pid, numThreads): mythreads = [] for tid in range(numThreads): name = "Proc-"+str(pid)+"-Thread-"+str(tid) th = ThreadRunner(name) mythreads.append(th) for i in mythreads: i.start() for i in mythreads : i.join() class ParallelExtractor : def runInParallel(self, numProcesses, numThreads) : myprocs = [] prrunner = ProcessRunner() for pid in range(numProcesses): pr = Process(target=prunner.runp, args=(pid, numThreads)) myprocs.append(pr) # if __name__ == "parallelTestModule": #Cela n'a pas fonctionné # if __name__ == "__main__": #Cela ne fonctionne évidemment pas # multiprocessing.freeze_support() #ajouté après avoir vu une erreur en vain pour i dans myprocs : i.start() for i dans myprocs : i.join ()