2

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

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 类。
* 在 AI 类中,有一个多处理池作为属性之一。
* 池是在 中定义的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()

顺便说一句,由于多处理在 Windows 上的工作方式,我不得不使用 processB() 模块函数。

另外我想指出我得到的错误 - 池不能被腌制 - 不应该指代我的代码的任何部分,因为我没有试图向子进程发送任何 Pool 对象。

有任何想法吗?

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

4

1 回答 1

0

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

于 2012-09-07T09:11:57.843 回答