티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보) 된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 주요 키워드를 미리 확인하세요.
RuntimeError on windows trying python multiprocessing
python 멀티프로세싱 시도하는 중 Window에서 런타임 오류
문제 내용
I am trying my very first formal python program using Threading and Multiprocessing on a windows machine. I am unable to launch the processes though, with python giving the following message. The thing is, I am not launching my threads in the main module. The threads are handled in a separate module inside a class.
나는 윈도우 머신에서 스레드화와 멀티프로세싱을 사용하는 나의 첫 번째 공식 파이썬 프로그램을 시도하고 있다. 그러나 파이썬이 다음 메시지를 제공하여 프로세스를 시작할 수 없습니다. 중요한 건, 난 메인 모듈에서 스레드를 실행하지 않을 거라는 거야. 스레드는 클래스 내의 별도 모듈에서 처리됩니다.
EDIT: By the way this code runs fine on ubuntu. Not quite on windows
편집: 그런데 이 코드는 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
is not going to be frozen to produce a Windows executable.
My original code is pretty long, but I was able to reproduce the error in an abridged version of the code. It is split in two files, the first is the main module and does very little other than import the module which handles processes/threads and calls a method. The second module is where the meat of the code is.
나의 원래 코드는 꽤 길지만, 나는 코드의 간략한 버전으로 오류를 재현할 수 있었다. 두 개의 파일로 나뉘는데, 첫 번째 파일은 메인 모듈이며 프로세스/스레드를 처리하고 메소드를 호출하는 모듈을 가져오는 것 외에는 거의 수행하지 않습니다. 두 번째 모듈은 코드의 핵심이 있는 곳입니다.
testMain.py:
testMain.py:
import parallelTestModule
extractor = parallelTestModule.ParallelExtractor()
extractor.runInParallel(numProcesses=2, numThreads=4)
parallelTestModule.py:
parallelTestModule.py:
import multiprocessing
from multiprocessing import Process
import threading
class ThreadRunner(threading.Thread):
""" This class represents a single instance of a running thread"""
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
print self.name,'\n'
class ProcessRunner:
""" This class represents a single instance of a running process """
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': #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()
높은 점수를 받은 Solution
On Windows the subprocesses will import (i.e. execute) the main module at start. You need to insert an if __name__ == '__main__':
guard in the main module to avoid creating subprocesses recursively.
Windows에서 하위 프로세스는 시작 시 메인 모듈을 가져옵니다(즉, 실행). 하위 프로세스가 반복적으로 생성되지 않도록 하려면 if_name_== '_main_': guard를 메인 모듈에 삽입해야 합니다.
Modified testMain.py
:
수정된 testMain.py:
import parallelTestModule
if __name__ == '__main__':
extractor = parallelTestModule.ParallelExtractor()
extractor.runInParallel(numProcesses=2, numThreads=4)
가장 최근 달린 Solution
hello here is my structure for multi process
안녕하세요 여기 다중 프로세스를 위한 제 구조입니다.
from multiprocessing import Process
import time
start = time.perf_counter()
def do_something(time_for_sleep):
print(f'Sleeping {time_for_sleep} second...')
time.sleep(time_for_sleep)
print('Done Sleeping...')
p1 = Process(target=do_something, args=[1])
p2 = Process(target=do_something, args=[2])
if __name__ == '__main__':
p1.start()
p2.start()
p1.join()
p2.join()
finish = time.perf_counter()
print(f'Finished in {round(finish-start,2 )} second(s)')
you don't have to put imports in the if __name__ == '__main__':
, just running the program you wish to running inside
내부에서 실행할 프로그램을 실행하기만 하면 __name_== '_main_':에 가져오기를 넣을 필요가 없습니다.
출처 : https://stackoverflow.com/questions/18204782/runtimeerror-on-windows-trying-python-multiprocessing
'개발 > 파이썬' 카테고리의 다른 글
Scraping: SSL: http://en.wikipedia.org에 대한 SSL: CERTIFICATE_VERIFI_FAILED 오류 (0) | 2022.11.27 |
---|---|
가져오기 오류: sklearn.cross_validation이라는 모듈이 없습니다. (0) | 2022.11.27 |
pytest는 모듈을 가져올 수 없지만 python은 가져올 수 있음 (0) | 2022.11.27 |
모듈을 찾을 수 없음 오류: __main_이 패키지가 아니라는 것은 무엇을 의미합니까? (0) | 2022.11.27 |
모듈을 가져올 때 파이썬에서 모듈을 실행하는 이유는 무엇이며, 어떻게 중지합니까? (0) | 2022.11.27 |