2013-01-05 1 views
13

초급 학생을위한 라이브러리를 가지고 놀고 있습니다. 파이썬에서 멀티 프로세싱 모듈을 사용하고 있습니다. , 예를 들어 importing and using a module that uses multiprocessing without causing infinite loop on Windows왜 Windows에서 새 프로세스를 시작할 때 Python의 다중 처리 모듈에서 __main__을 가져 오나요?

내가 모듈 mylibrary.py 있다고 가정합니다 :이 문제에 달렸다 나는에 main.py를 실행하면

# main.py 

import mylibrary 

mylibrary.foo() 

:

# mylibrary.py 

from multiprocessing import Process 

class MyProcess(Process): 
    def run(self): 
     print "Hello from the new process" 

def foo(): 
    p = MyProcess() 
    p.start() 

그리고이 라이브러리를 호출하는 메인 프로그램을 Windows에서는 main.py를 새 프로세스로 가져 오려고합니다. 즉, 코드가 다시 실행되어 프로세스 생성의 무한 루프가 발생합니다. 나는 그것을 이렇게 고칠 수있다 :

import mylibrary 

if __name__ == "__main__": 
    mylibrary.foo() 

그러나 이것은 초보자에게는 꽤 혼란스럽고, 더 이상 필요하지 않은 것처럼 보인다. 새 프로세스가 mylibrary에 생성되므로 새 프로세스가 mylibrary을 가져 오지 않는 이유는 무엇입니까? main.py을 변경하지 않고이 문제를 해결할 수있는 방법이 있습니까?

나는 파이썬 2.7을 사용하고 있습니다.

답변

23

Windows에는 fork이 없으므로 기존 프로세스와 같이 새 프로세스를 만들 수는 없습니다. 따라서 자식 프로세스는 코드를 다시 실행해야하지만 이제는 부모 프로세스와 자식 프로세스를 구분할 방법이 필요합니다. __main__입니다.

이는 여기에 문서에서 설명합니다 : 나는 포크 폭탄 효과를 방지하기 위해 코드를 구성하는 또 다른 방법을 모르는 http://docs.python.org/2/library/multiprocessing.html#windows

.

+4

이 답변을 받아 들여야합니다. – Marcin

+1

나는 뭔가를 놓치고있다.하지만 내 질문은 왜 자식 프로세스가 모든 코드를 다시 실행해야하는지이다. 왜 새로운 프로세스를 시작한 모듈이 아닌가? – Laura

+0

@Laura : 코드를 다시 실행해야합니다. 그렇지 않으면 코드가 생기지 않기 때문입니다. 하위 프로세스는 완전히 새로운 것으로 시작하고 함수가 필요하면 코드가 필요합니다. –

관련 문제