나는 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
사용)하면된다? 세 가지 옵션 :
- 처음에는 4 개의 스레드를 생성하고 처음 네 개의 작업을 완료하고 스레드가 종료되도록하십시오. 그런 다음 나머지 작업에 대해 2 개의 새 스레드를 생성합니까?
- 일부 스레드가 해당 작업을 완료하자마자 4 개의 스레드를 할당하고 4 개의 스레드를 할당하며 동일한 스레드에 새 작업을 할당합니다.
- 다른 방법.
이 통찰력은 자극에서보다 효과적으로 Pool.map()
을 사용하는 것을 생각하는 데 도움이되므로 도움이됩니다.
실질적으로 내가 아는 모든 수영장은 (2). 하지만이 특정 라이브러리에 대해 잘 모릅니다. 일반적으로 파이썬 + 멀티 스레드와 관련된 실망스러운 경험이 있습니다. 제한적으로 똑똑한 해결책이 가능하다고 생각합니다. 자세한 답변을 위해 행운을 빈다. – peterh
'print_it' 함수를'sleep' 함수로 만들면 어떻게 될지 테스트 할 수 있습니다. 그리고 파이썬 3.6에서이 테스트를 수행하면 여분의 스레드가 처리되는 즉시 새 작업이 시작되는 것처럼 보입니다. – quamrana
[출처 읽기] (https://github.com/python/cpython/blob/5e02c7826f9797fb3add79b608ef51f7a62b3e5a/Lib/multiprocessing/pool.py#L146)를보고 직접 확인해보십시오. 'ThreadPool' 클래스는 보통'multiprocessing.pool.Pool'의 서브 클래스입니다. 몇가지를 오버라이드합니다 (당신이 원한다면 정의를 볼 수 있습니다). – Blckknght