티스토리 뷰

반응형

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

반응형
댓글
공지사항
최근에 올라온 글