进程内的多进程池超时
每次我使用下面的代码时,结果总是超时,这是不是我逻辑上做错了什么?
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()
我知道有一个这个bug,我本以为在python 2.6.4中会修复这个问题?
1 个回答
2
你不能在不同的进程之间传递池对象。
如果你尝试运行这段代码,Python会报错:'NotImplementedError: pool objects cannot be passed between processes or pickled',意思是池对象不能在进程间传递或者被序列化。
from multiprocessing import Queue, Pool
q = Queue()
ppool = Pool(processes=2)
q.put([ppool])
ppool = q.get()
所以,如果你想让你的代码正常工作,就在add_wrap方法里创建你的池对象。
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()