RuntimeError no Windows tentando multiprocessamento python

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

Estou tentando meu primeiro programa python formal usando Threading e Multiprocessing em uma máquina Windows. Porém, não consigo iniciar os processos, com python dando a seguinte mensagem. O problema é que não estou lançando meus tópicos no módulo principal. As threads são tratadas em um módulo separado dentro de uma classe.

EDIT: A propósito, este código funciona bem no Ubuntu. Não exatamente no Windows

RuntimeError: Tentativa de iniciar um novo processo antes que o processo atual tenha terminado sua fase de inicialização. Isso provavelmente significa que você está no Windows e esqueceu de usar o idioma apropriado no módulo principal: if __name__ == "__main__": freeze_support() ... A linha "freeze_support()" pode ser omitida se o programa estiver não será congelado para produzir um executável do Windows. 

Meu código original é bem longo, mas consegui reproduzir o erro em uma versão resumida do código. Ele é dividido em dois arquivos, o primeiro é o módulo principal e faz muito pouco além de importar o módulo que trata de processos/threads e chama um método. O segundo módulo é onde está a essência do código.


testMain.py:

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

parallelTestModule.py:

import multiprocessing from multiprocessing import Classe de threading de importação de processo ThreadRunner(threading.Thread): """ Esta classe representa uma única instância de um thread em execução""" def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): print self.name," " class ProcessRunner: """ Esta classe representa uma única instância de um processo em execução """ 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() para i em 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": #Isto não funcionou # if __name__ == "__main__": #Isso obviamente não funciona # multiprocessing.freeze_support() #adicionado após ver erro sem sucesso para i em myprocs: i.start() for i em myprocs: i.join ()