我不知道为什么,但昨天我正在测试我编写的一些多处理代码,它工作正常。然后今天当我再次检查代码时,它会给我这个错误:
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 更新之后。)