2017-09-22 2 views
3

나는 multiprocessing 라이브러리에 아주 익숙하며 map()과 함께 사용하면 해당 모듈의 Pool 모듈과 관련하여 질문이 있습니다. 4 개의 작업자 스레드와 6 개의 작업이 완료되었다고 가정합니다. 내가 내가 Pool.map()가 작업을 처리하는 방법을 이해하려는pool.map()이 내부적으로 작업을 할당하는 방법은 무엇입니까?

from multiprocessing.dummy import Pool as ThreadPool 

def print_it(num): 
    print num 

def multi_threaded(): 
    tasks = [1, 2, 3, 4, 5, 6] 
    pool = ThreadPool(4) 
    r = pool.map(print_it, tasks) 
    pool.close() 
    pool.join() 

multi_threaded() 

(I 스레드가 아닌 프로세스를 생성하기 원하기 때문에 multiprocessing.dummy 사용)하면된다? 세 가지 옵션 :

  1. 처음에는 4 개의 스레드를 생성하고 처음 네 개의 작업을 완료하고 스레드가 종료되도록하십시오. 그런 다음 나머지 작업에 대해 2 개의 새 스레드를 생성합니까?
  2. 일부 스레드가 해당 작업을 완료하자마자 4 개의 스레드를 할당하고 4 개의 스레드를 할당하며 동일한 스레드에 새 작업을 할당합니다.
  3. 다른 방법.

이 통찰력은 자극에서보다 효과적으로 Pool.map()을 사용하는 것을 생각하는 데 도움이되므로 도움이됩니다.

+0

실질적으로 내가 아는 모든 수영장은 (2). 하지만이 특정 라이브러리에 대해 잘 모릅니다. 일반적으로 파이썬 + 멀티 스레드와 관련된 실망스러운 경험이 있습니다. 제한적으로 똑똑한 해결책이 가능하다고 생각합니다. 자세한 답변을 위해 행운을 빈다. – peterh

+0

'print_it' 함수를'sleep' 함수로 만들면 어떻게 될지 테스트 할 수 있습니다. 그리고 파이썬 3.6에서이 테스트를 수행하면 여분의 스레드가 처리되는 즉시 새 작업이 시작되는 것처럼 보입니다. – quamrana

+0

[출처 읽기] (https://github.com/python/cpython/blob/5e02c7826f9797fb3add79b608ef51f7a62b3e5a/Lib/multiprocessing/pool.py#L146)를보고 직접 확인해보십시오. 'ThreadPool' 클래스는 보통'multiprocessing.pool.Pool'의 서브 클래스입니다. 몇가지를 오버라이드합니다 (당신이 원한다면 정의를 볼 수 있습니다). – Blckknght

답변

1

풀을 정의하는 방법에 따라 다릅니다.

예를 들어 설명한 것처럼 (2)가 발생합니다. Pool에 따라 스레드 또는 프로세스가 시작됩니다 (풀을 Pool__init__() 발생 -이 작업을 제출할 필요가 없음). 작업 대기 중으로 대기합니다. 작업이 도착하여 실행되면 스레드 또는 프로세스가 종료되지 않고 더 많은 작업을 기다리는 대기 상태로 돌아갑니다.

다르게 정의 할 수 있습니다. 풀에 maxtasksperchild 매개 변수를 추가 할 수 있습니다. 작업자가 이러한 양의 작업을 완료하자마자 종료되고 새 작업자가 즉시 시작됩니다 (작업을 먼저 수행 할 필요가 없으며 작업자가 종료되자 마자 실행됩니다). 이것은 풀 클래스 Pool._maintain_pool()Pool._repopulate_pool() 함수에서 관리됩니다.

근로자가 시작시 무기를 발사하여 무기한 실행하려면 지금하는 일을하십시오. 그러면 이런 일이 발생합니다. 작업자가 시작시에 시작하지만 종료 (필요한 경우 하나) 한 후에도 종료 및 갱신하려면 maxtasksperchild을 사용하십시오. 프로세스 나 스레드를 필요로하기 전에 프로세스 나 스레드를 시작하지 않으려면 Pool을 사용하지 마십시오. 스레드 또는 프로세스를 필요할 때 실행하고 직접 관리하십시오.

희망이 도움이됩니다.

+0

환상적인 대답입니다. 감사합니다. – Pranjal

관련 문제