타이밍이 늦어졌습니다. Windows는 Pool
에 4 개의 프로세스를 생성해야하는데,이 프로세스는 시작, 초기화 및 Queue
에서 사용할 준비가 필요합니다. Windows에서이 작업을 수행하려면 각 하위 프로세스에서 __main__
모듈을 다시 가져와야하며 에 의해 내부적으로 사용되는 Queue
인스턴스가 각 자식에서 언 패킹되어야합니다. 이것은 의미심장 한 시간을 필요로합니다. 실제로는 map_async()
호출이 모두 실행되어 Pool
의 모든 프로세스가 실행되고 실행될 때까지 충분히 길다. 당신이 각 직원에 의해 운영되는 일부 추적 기능을 추가 할 경우이 작업을 볼 수 Pool
:
while maxtasks is None or (maxtasks and completed < maxtasks):
try:
print("getting {}".format(current_process()))
task = get() # This is getting the task from the parent process
print("got {}".format(current_process()))
출력 :
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
process id = 5145
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
process id = 5145
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
result = [121]
result1 = [100]
getting <ForkServerProcess(ForkServerPoolWorker-2, started daemon)>
getting <ForkServerProcess(ForkServerPoolWorker-3, started daemon)>
getting <ForkServerProcess(ForkServerPoolWorker-4, started daemon)>
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
는 당신이 Worker-1
시작,보고 노동자 전에 두 작업을 소모 수 있듯이 2-4 번도 Queue
에서 소비하려고합니다.
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
getting <ForkServerProcess(ForkServerPoolWorker-2, started daemon)>
getting <ForkServerProcess(ForkServerPoolWorker-3, started daemon)>
getting <ForkServerProcess(ForkServerPoolWorker-4, started daemon)>
# <sleeping here>
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
process id = 5183
got <ForkServerProcess(ForkServerPoolWorker-2, started daemon)>
process id = 5184
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
getting <ForkServerProcess(ForkServerPoolWorker-2, started daemon)>
result = [121]
result1 = [100]
got <ForkServerProcess(ForkServerPoolWorker-3, started daemon)>
got <ForkServerProcess(ForkServerPoolWorker-4, started daemon)>
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)>
got <ForkServerProcess(ForkServerPoolWorker-2, started daemon)>
가 (당신이 볼 수있는 여분의 "getting
/"got"
문이라는 것을 참고 : 주요 과정에서 Pool
를 인스턴스화 한 후에 만 map_async
를 호출하기 전에 sleep
호출을 추가하면 다른 프로세스가 각 요청을 처리 할 볼 수 있습니다 감시단은 각 프로세스로 보내져 정상적으로 종료됩니다.)
Linux에서 Python 3.x를 사용하면 'spawn'
및 'forkserver'
컨텍스트를 사용하여이 동작을 재현 할 수 있지만 'fork'
은 사용할 수 없습니다. 아마도 자식 프로세스를 포크하는 것이 더럽기 때문에 __main__
을 다시 가져 오는 것보다 훨씬 빠릅니다.
하는 Windows를 사용하고 있습니까? – dano
@ dano-yes ....., – user1050619