멀티 프로세싱 모듈을 사용하여 디렉토리 구조를 빠르게 탐색하려고합니다. 우선 제가 조사를 좀 해봤이 스택 오버플로 스레드 발견 : 나는 스레드의 코드를 적용하려고 할 때Python 멀티 프로세싱 모듈에서 큐와 함께 풀 사용
How do I run os.walk in parallel in Python?
그러나, 나는이 문제에 실행에 보관합니다. 여기에 그냥 풀을 테스트하고 :
import os
from multiprocessing.pool import Pool
from multiprocessing import Process
from multiprocessing import JoinableQueue as Queue
def scan():
print "Hi!"
while True:
print "Inside loop"
directory = unsearched.get()
print "Got directory"
unsearched.task_done()
print "{0}".format(directory)
if __name__ == '__main__':
# Put those directories on the queue
unsearched = Queue()
top_dirs = ['a', 'b', 'c']
for d in top_dirs:
unsearched.put(d)
print unsearched
# Scan the directories
processes = 1
pool = Pool(processes)
for i in range(processes):
print "Process {0}".format(i)
pool.apply_async(scan)
# Block until all the tasks are done
unsearched.join()
print 'Done'
은 무엇 일어나고있는 것은 스크립트가 스캔 기능의 내부 루프의 내부에가는 것이 어떻게 작동하는지 알아 내기 위해 쓴 작은 스크립트이며, 단지 거기에 앉아 :
PS C:\Test> python .\multiprocessing_test.py
<multiprocessing.queues.JoinableQueue object at 0x000000000272F630>
Process 0
Hi!
Inside loop
나는 여기에서 간단한 것을 놓치고 있다고 확신합니다.
그것은 작동합니다! 하위 프로세스에서 Traceback을 볼 수있는 방법이 있습니까? –
@ChristopherSpears 일반적으로'apply_async' 호출의 결과를 가져 오려고 할 때 traceback을 얻을 것입니다. 각각의 결과를리스트에 저장하고'unsearched.join()'을 호출하기 전에 각각에 대해'result.get()'을 호출하면 예외를받을 수 있고 영원히 멈추지 않을 것이라고 생각합니다. – dano
좋아요! 그것은 효과가있다! 감사! –