2017-05-06 3 views
2

context은 생성자에서 선택적 인수로 class multiprocessing.pool.Pool입니다. Documentation는 말한다 : 작업자 프로세스를 시작하기 위해 사용되는 컨텍스트를 지정하는 데 사용할 수 있습니다`multiprocessing.pool.Pool`에서`context` 인수의 의미는 무엇입니까?

context. 일반적으로 풀은 multiprocessing.Pool() 함수 또는 Pool() 컨텍스트 개체 메서드를 사용하여 만들어집니다. 두 경우 모두 상황이 적절하게 설정됩니다.

그것은 class Pool 생성자는 그것이 언급 한 시나리오에서 "적절하게 설정되어있는"것을 의미한다 무엇을 필요로하고 왜 "컨텍스트 개체는"무엇 명확하지 않습니다.

답변

1

플랫폼에 따라 멀티 프로세싱은 프로세스를 시작하는 세 가지 방법을 지원합니다. 이러한 시작 방법은 다음과 같습니다

  • 산란은 :

    부모 프로세스는 신선한 파이썬 인터프리터 프로세스를 시작합니다.
    유닉스와 윈도우에서 사용 가능합니다. Windows의 기본값.

  • 포크 : 부모 프로세스는 os.fork 사용

    () 파이썬 인터프리터를 포크. 유닉스에서만 사용 가능합니다. Unix의 기본값.

  • 프로그램이 시작되고 forkserver 개시 방법을 선택하기, 서버 프로세스가 시작

    forkserver. 그 이후부터 새로운 프로세스가 필요할 때마다 상위 프로세스가 서버에 연결하여 새로운 프로세스를 생성하도록 요청합니다. 포크 서버 프로세스는 단일 스레드이므로 os.fork()를 사용하는 것이 안전합니다. 불필요한 자원은 상속되지 않습니다.

    Unix 파이프를 통해 파일 설명자를 전달할 수있는 Unix 플랫폼에서 사용할 수 있습니다.


은 메인 모듈의 if __name__ == '__main__' 절에 set_start_method()를 사용 시작 방법을 선택합니다. 예를 들어,

import multiprocessing as mp 

def foo(q): 
    q.put('hello') 

if __name__ == '__main__': 
    mp.set_start_method('spawn') 
    q = mp.Queue() 
    p = mp.Process(target=foo, args=(q,)) 
    p.start() 
    print(q.get()) 
    p.join() 

또는 get_context()를 사용하여 컨텍스트 개체를 얻을 수 있습니다. 컨텍스트 개체는 다중 처리 모듈과 동일한 API를 사용하므로 동일한 프로그램에서 여러 시작 메서드를 사용할 수 있습니다.

import multiprocessing as mp 

def foo(q): 
    q.put('hello') 

if __name__ == '__main__': 
    ctx = mp.get_context('spawn') 
    q = ctx.Queue() 
    p = ctx.Process(target=foo, args=(q,)) 
    p.start() 
    print(q.get()) 
    p.join() 

이것은 컨텍스트 개체의 출처입니다.

+0

컨텍스트 관리자에 대한 몇 가지 무관 한 일치 후에 해당 doc 페이지에서'context'라는 단어를 검색하는 것을 포기하지 않았다면 :) – max