2009-11-17 256 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,并会想到,它会一直固定在Python 2.6.4?

回答

2

您不能在进程之间传递Pool对象。

如果您尝试此代码,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

我在想同样的观点,但它仍然导致Timeout异常。看起来Pool()从来没有打算从Process()内部调用,尽管我会认为这将是一个可行的操作。 – NeonNinja

+0

我在Ubuntu Karmic中没有得到python 2.6.4的超时异常。你使用什么操作系统/ Python版本? –

+0

我的糟糕的测试你的解决方案使用一个蟒蛇2.6失败,在2.6.4正常工作,+接受 – NeonNinja