进程内的多进程池超时问题

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()

我知道这个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方法中创建您的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()

我也是这么想的,但仍然导致了超时异常。看起来Pool()从Process()内部调用并不是本意,尽管我认为这应该是可行的操作。 - NeonNinja
我在Ubuntu Karmic中使用Python 2.6.4没有出现超时异常。您使用的操作系统/Python版本是什么? - Gautier Hayoun
我的错,我使用了Python 2.6测试您的解决方案,但失败了。在2.6.4上运行良好,已接受。 - NeonNinja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接