2014-07-11 3 views
2

멀티 프로세싱 모듈을 사용하여 디렉토리 구조를 빠르게 탐색하려고합니다. 우선 제가 조사를 좀 해봤이 스택 오버플로 스레드 발견 : 나는 스레드의 코드를 적용하려고 할 때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 

나는 여기에서 간단한 것을 놓치고 있다고 확신합니다.

답변

2

이것은 실제로 Linux에서 나에게 잘 작동하지만 Windows에서는 멈춘다. 이는 Windows에서 if __name__ ... 가드 내부의 모든 내용이 하위 프로세스에서 실행되지 않기 때문입니다. 물론 unsearched을 정의하는 것이 포함됩니다. 즉, scanunsearched을 사용하려고 시도 할 때 예외를 던지고 있지만 그 예외는 부모에서 절대로 사용되지 않으므로 CLI에 추적 표시가 나타나지 않습니다. 대신, 그것은 단지 매달린다.

당신이 아이의 범위에 unsearched을 만들기 위해 Pool을 만들 때 initializer/ initargs 키워드 인수를 사용할 수 있습니다, 윈도우와 리눅스에서이 작업을하려면 ...

def initializer(q): 
    global unsearched 
    unsearched = q 

그런 다음 이전 Pool 전화를 다음으로 대체하십시오.

pool = Pool(processes, initializer=initializer, initargs=(unsearched,)) 
+0

그것은 작동합니다! 하위 프로세스에서 Traceback을 볼 수있는 방법이 있습니까? –

+0

@ChristopherSpears 일반적으로'apply_async' 호출의 결과를 가져 오려고 할 때 traceback을 얻을 것입니다. 각각의 결과를리스트에 저장하고'unsearched.join()'을 호출하기 전에 각각에 대해'result.get()'을 호출하면 예외를받을 수 있고 영원히 멈추지 않을 것이라고 생각합니다. – dano

+0

좋아요! 그것은 효과가있다! 감사! –