2012-11-30 3 views
5

내 프로젝트에서 멀티 프로세싱을 사용하고 있습니다. 결과를 대기열에 넣는 작업자 함수가 있습니다. 모든 것이 잘 작동합니다. 그러나 x의 크기가 커지면 (내 경우 x는 배열이다.) 뭔가 잘못되었다.파이썬에서 다중 처리가 차단되었습니다.

def do_work(queue, x): 
    result = heavy_computation_function(x) 
    queue.put(result) # PROBLEM HERE 

def parallel_something(): 
    queue = Queue() 
    procs = [Process(target=do_work, args=i) for i in xrange(20)] 
    for p in procs: p.start() 
    for p in procs: p.join() 

    results = [] 
    while not queue.empty(): 
     results.append(queue.get) 

    return results 

내가 파이썬 프로세스가 작동,하지만 뭔가 일이 모든 프로세스가 실행하지만 아무것도하지 않고있다 모니터링 시스템에서 볼 : 여기 내 코드의 단순화 된 버전입니다. 이것은 ctrl-D를 입력 할 때 얻는 것입니다.

pid, sts = os.waitpid(self.pid, flag) 
KeyboardInterrupt 

몇 가지 테스트를 수행합니다. 문제는 큐에 결과를 넣는 것과 같아요. 결과를 넣지 않으면 효과가 있지만 아무런 목적도 없습니다.

+4

대기열 개체를 새 프로세스로 전달하지 않는 것처럼 보입니다. 또한'Process'의'args'는'튜플 (tuple) '이어야합니다. 'args = (queue, i)'로 변경해보십시오. 'queue.get'는 괄호가 필요하기 때문에'queue.get()'이됩니다. – Wessie

답변

3

글쎄, 파이썬의 큐 모듈에 버그가있는 것 같습니다. 사실 작품을 ..everything

from multiprocessing import Manager 

queue = Manager().Queue() 

.. 사용하지만, 난 여전히 이유를 모르겠어요 .. :)

+0

차이점은'Queue()'대신에'Manager(). Queue()'를 인스턴스화한다는 것입니다. 이것은'Manager .__ init __()'이 첫 번째 형식에서 호출되지만 두 번째 형식에서는 호출되지 않는다는 것을 의미한다고 생각합니다. – Patrick

5

당신은 아마 교착 상태를 생성한다. programming guidelines에서

: 이것은 당신이 큐를 사용할 때마다 프로세스가 합류하기 전에 큐에 넣어 모든 항목은 결국 제거됩니다 있는지 확인해야한다는 것을 의미

. 그렇지 않으면 대기열에 항목을 넣은 프로세스가 종료 될지 확신 할 수 없습니다. 비 데몬 프로세스는 자동으로 조인됩니다.

가능한 수정 사항은 페이지에서도 제안되었습니다. 프로세스가 결합되지 않는다고해서 어떤 의미에서든 리소스를 "점유"한다는 것을 의미하지는 않습니다. 즉, 프로세스가 작업을 완료 한 후 (아마도 locks을 사용하여) 대기중인 데이터를 가져 와서 나중에 프로세스에 참여할 수 있습니다.

관련 문제