我不知道为什么,但昨天我正在测试我编写的一些多处理代码并且它工作正常。然后今天当我再次检查代码时,它会给我这个错误:
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更新之后。)
答案 0 :(得分:0)
也许您的B类对象包含对A实例的引用。