RuntimeError w systemie Windows przy próbie wieloprocesowego przetwarzania w Pythonie

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

Próbuję mojego pierwszego formalnego programu Pythona, używając wątków i wieloprocesorowości na komputerze z systemem Windows. Nie mogę jednak uruchomić procesów, a python wyświetla następujący komunikat. Chodzi o to, że nie uruchamiam swoich wątków w module głównym. Wątki są obsługiwane w oddzielnym module wewnątrz klasy.

EDYTUJ: Nawiasem mówiąc, ten kod działa dobrze na ubuntu. Niezupełnie w systemie Windows

RuntimeError: Spróbuj uruchomić nowy proces, zanim bieżący proces zakończy fazę ładowania początkowego. Prawdopodobnie oznacza to, że jesteś w systemie Windows i zapomniałeś użyć właściwego idiomu w głównym module: if __name__ == "__main__": freeze_support() ... Wiersz "freeze_support()" można pominąć, jeśli program jest nie zostanie zamrożony w celu utworzenia pliku wykonywalnego systemu Windows. 

Mój oryginalny kod jest dość długi, ale udało mi się odtworzyć błąd w skróconej wersji kodu. Jest podzielony na dwa pliki, pierwszy jest modułem głównym i niewiele robi poza importem modułu, który obsługuje procesy/wątki i wywołuje metodę. W drugim module znajduje się treść kodu.


testMain.py:

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

parallelTestModule.py:

import multiprocessing z multiprocessing import Proces importowania klasy wątków ThreadRunner(threading.Thread): """ Ta klasa reprezentuje pojedynczą instancję działającego wątku""" def __init__(self, name): threading.Thread.__init__(self) self.name = nazwa def run(self): print self.name," " class ProcessRunner: """ Ta klasa reprezentuje pojedynczą instancję uruchomionego procesu """ def runp(self, pid, numThreads): mitreads = [] for tid in range(numThreads): name = "Proc-"+str(pid)+"-Thread-"+str(tid) th = ThreadRunner(name) mitreads.append(th) for i w mitreads: i.start() for i w mitreads: klasa i.join() ParallelExtractor: def runInParallel(self, numProcesses, numThreads): myprocs = [] prunner = ProcessRunner() dla pid w zakresie(numProcesses): pr = Process(target=prunner.runp, args=(pid, numThreads)) myprocs.append(pr) # if __name__ == "parallelTestModule": #To nie zadziałało # if __name__ == "__main__": #To oczywiście nie działa # multiprocessing.freeze_support() #dodano po wyświetleniu błędu bez skutku dla i w myprocs: i.start() dla i w myprocs: i.join ()