RuntimeError su Windows che prova il multiprocessing Python

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

Sto provando il mio primo programma python formale che utilizza Threading e Multiprocessing su una macchina Windows. Tuttavia, non sono in grado di avviare i processi, con Python che fornisce il seguente messaggio. Il fatto è che non sto avviando i miei thread nel modulo principale. I thread vengono gestiti in un modulo separato all'interno di una classe.

EDIT: A proposito, questo codice funziona bene su Ubuntu. Non proprio su Windows

RuntimeError: Tentativo di avviare un nuovo processo prima che il processo corrente abbia terminato la sua fase di bootstrap. Questo probabilmente significa che sei su Windows e hai dimenticato di usare l'idioma corretto nel modulo principale: if __name__ == "__main__": freeze_support() ... La riga "freeze_support()" può essere omessa se il programma è non verrà bloccato per produrre un eseguibile di Windows. 

Il mio codice originale è piuttosto lungo, ma sono riuscito a riprodurre l'errore in una versione ridotta del codice. È diviso in due file, il primo è il modulo principale e non fa molto altro che importare il modulo che gestisce processi/thread e chiama un metodo. Il secondo modulo è dove si trova la parte centrale del codice.


testMain.py:

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

parallelTestModule.py:

import multiprocessing da multiprocessing import Process import threading class ThreadRunner(threading.Thread): """ Questa classe rappresenta una singola istanza di un thread in esecuzione""" def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): print self.name," " class ProcessRunner: """ Questa classe rappresenta una singola istanza di un processo in esecuzione """ 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 = [] prunner = ProcessRunner() for pid in range(numProcesses): pr = Process(target=prunner.runp, args=(pid, numThreads)) myprocs.append(pr) # if __name__ == "parallelTestModule": #Non ha funzionato # if __name__ == "__main__": #Ovviamente non funziona # multiprocessing.freeze_support() #aggiunto dopo aver visto l'errore senza alcun risultato per i in myprocs: i.start() per i in myprocs: i.join ()