2009-11-17 8 views
3

언제든지 다음 코드를 사용하면 풀 결과가 항상 시간 초과를 반환하지만 논리적으로 잘못된 작업이 있습니까?프로세스 시간 초과 내부의 다중 처리 풀

from multiprocessing import Pool, Process, cpu_count 

def add(num): 
    return num+1 

def add_wrap(num): 
    new_num = ppool.apply_async(add, [num]) 
    print new_num.get(timeout=3) 

ppool = Pool(processes=cpu_count()) 

test = Process(target=add_wrap, args=(5,)).start() 

나는 this bug 알고 있어요, 그것은 파이썬 2.6.4에서 수정 된 것이라고 생각이나 했 겠어요?

답변

2

프로세스간에 풀 개체를 전달할 수 없습니다.

이 코드를 사용하면 Python에서 'NotImplementedError : 프로세스간에 풀 객체를 전달할 수 없거나 절인 됨'예외가 발생합니다.

from multiprocessing import Queue, Pool 

q = Queue() 
ppool = Pool(processes=2)              
q.put([ppool]) 
ppool = q.get() 

코드를 작동 시키려면 add_wrap 메소드에서 Pool 객체를 만드십시오.

from multiprocessing import Pool, Process, cpu_count 

def add(num): 
    return num+1 

def add_wrap(num): 
    ppool = Pool(processes=cpu_count()) 
    new_num = ppool.apply_async(add, [num]) 
    print new_num.get(timeout=3) 

test = Process(target=add_wrap, args=(5,)).start() 
+0

동일한 줄을 생각하고 있었지만 여전히 시간 초과 예외가 발생했습니다. Pool()은 Process() 내부에서 호출 할 의도가 없었던 것처럼 보이지만 실현 가능한 작업이라고 생각했을 것입니다. – NeonNinja

+0

우분투 Karmic에서 파이썬 2.6.4로 타임 아웃 예외를 얻지 못했습니다. 어떤 운영 체제/파이썬 버전을 사용합니까? –

+0

내 잘못하면 Python 2.6을 사용하여 솔루션을 테스트 한 결과, 2.6.4에서는 정상적으로 작동하고 +는 받아 들일 수 있습니다. – NeonNinja