RuntimeError on windows trying python multiprocessing
Ошибка RuntimeError в Windows при попытке многопроцессорной обработки python
Я пробую свою самую первую официальную программу на python, использующую многопоточность на компьютере с Windows. Однако я не могу запустить процессы, поскольку python выдает следующее сообщение. Дело в том, что я не запускаю свои потоки в основном модуле. Потоки обрабатываются в отдельном модуле внутри класса.
РЕДАКТИРОВАТЬ: Кстати, этот код отлично работает в ubuntu. Не совсем в Windows
RuntimeError: Attempt to start a new process before the current process has finished its bootstrapping phase. This probably means that you are on Windows and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program isnot going to be frozen to produce a Windows executable.
Мой исходный код довольно длинный, но я смог воспроизвести ошибку в сокращенной версии кода. Он разделен на два файла, первый является основным модулем и делает очень мало, кроме импорта модуля, который обрабатывает процессы / потоки и вызывает метод. Во втором модуле находится основная часть кода.
import multiprocessing from multiprocessing import Process import threading
classThreadRunner(threading.Thread): """ This class represents a single instance of a running thread""" def__init__(self, name): threading.Thread.__init__(self) self.name = name defrun(self): print self.name,'\n'
classProcessRunner: """ This class represents a single instance of a running process """ defrunp(self, pid, numThreads): mythreads = [] for tid inrange(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()
classParallelExtractor: defrunInParallel(self, numProcesses, numThreads): myprocs = [] prunner = ProcessRunner() for pid inrange(numProcesses): pr = Process(target=prunner.runp, args=(pid, numThreads)) myprocs.append(pr) # if __name__ == 'parallelTestModule': #This didnt work # if __name__ == '__main__': #This obviously doesnt work # multiprocessing.freeze_support() #added after seeing error to no avail for i in myprocs: i.start()
for i in myprocs: i.join()
Переведено автоматически
Ответ 1
В Windows подпроцессы импортируют (т. Е. Выполняют) основной модуль при запуске. Вам нужно вставить if __name__ == '__main__': защиту в основной модуль, чтобы избежать рекурсивного создания подпроцессов.
Изменено testMain.py:
import parallelTestModule
if __name__ == '__main__': extractor = parallelTestModule.ParallelExtractor() extractor.runInParallel(numProcesses=2, numThreads=4)
Ответ 2
Попробуйте поместить свой код внутри основной функции в testMain.py
import parallelTestModule
if __name__ == '__main__': extractor = parallelTestModule.ParallelExtractor() extractor.runInParallel(numProcesses=2, numThreads=4)
"For an explanation of why (on Windows) the if __name__ == '__main__' part is necessary, see Programming guidelines."
в котором говорится
"Убедитесь, что основной модуль может быть безопасно импортирован новым интерпретатором Python, не вызывая непреднамеренных побочных эффектов (таких как запуск нового процесса)".
... используя if __name__ == '__main__'
Ответ 3
Хотя предыдущие ответы верны, есть небольшое осложнение, на которое было бы полезно обратить внимание.
В случае, если ваш основной модуль импортирует другой модуль, в котором глобальные переменные или переменные-члены класса определены и инициализированы для (или с использованием) некоторых новых объектов, вам, возможно, придется настроить этот импорт таким же образом:
if __name__ == '__main__': import my_module
Ответ 4
здравствуйте, вот моя структура для многопроцессорной обработки