Python 3.2多处理NotImplementedError:池对象不能

时间:2012-09-07 08:33:54

标签: python python-3.x multiprocessing multicore

我不知道为什么,但昨天我正在测试我编写的一些多处理代码并且它工作正常。然后今天当我再次检查代码时,它会给我这个错误:

Exception in thread Thread-5:
Traceback (most recent call last):
  File "C:\Python32\lib hreading.py", line 740, in _bootstrap_inner
    self.run()
  File "C:\Python32\lib hreading.py", line 693, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python32\lib\multiprocessing\pool.py", line 342, in _handle_tasks
    put(task)
  File "C:\Python32\lib\multiprocessing\pool.py", line 439, in __reduce__
    'pool objects cannot be passed between processes or pickled'
NotImplementedError: pool objects cannot be passed between processes or pickled

我的代码结构如下:
*我有2个模块,比如A.py和B.py.
* A.py中定义了一个名为A.
的类 * B.py类似地有B类。
*在A类中,我有一个多处理池作为其中一个属性 *池在A.__init__()中定义,但在另一种方法中使用 - run()
*在A.run()中我设置了B类某些对象的一些属性(在名为objBList的列表中收集),然后我使用pool.map(processB, objBList)
* processB()是一个模块函数(在A.py中),它作为唯一参数(B的实例)接收并调用B.runInput()
*错误发生在pool.map()行。

基本上在A.py:

class A:
   def __init__(self):
      self.pool = multiprocessing.Pool(7)
   def run(self):
      for b in objBList:
         b.inputs = something
      result = self.pool.map(processB, objBList)
      return list(result)
def processB(objB):
   objB.runInputs()

和B.py:

class B:
   def runInputs(self):
       do_something()

BTW,我被迫使用processB()模块函数,因为Windows上的多处理工作的方式。

另外我想指出我得到的错误 - 该池无法被腌制 - 不应该引用我的代码的任何部分,因为我不是要尝试发送子进程任何池对象。

有什么想法吗?

(PS:我还应该提一下,在我测试此功能的两天之间,计算机意外重启 - 可能是在安装Windows更新之后。)

1 个答案:

答案 0 :(得分:0)

也许您的B类对象包含对A实例的引用。