进程内的多进程池超时

3 投票
1 回答
3649 浏览
提问于 2025-04-15 16:06

每次我使用下面的代码时,结果总是超时,这是不是我逻辑上做错了什么?

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

撰写回答