【发布时间】:2019-12-16 20:38:05
【问题描述】:
我试图有一个简单的OrderedDict 子类,它由Pool 创建然后返回。
似乎将创建的对象返回到池中时的酸洗过程尝试重新实例化该对象并由于__init__ 函数中所需的附加参数而失败。
这是一个最小(非)工作示例:
from collections import OrderedDict
from multiprocessing import Pool
class Obj1(OrderedDict):
def __init__(self, x, *args, **kwargs):
super().__init__(*args, **kwargs)
self.x = x
def task(x):
obj1 = Obj1(x)
return obj1
if __name__ == '__main__':
with Pool(1) as pool:
for x in pool.imap_unordered(task, (1,2,3)):
print(x.x)
如果我这样做,我会收到以下错误。
线程 Thread-3 中的异常: 回溯(最近一次通话最后): _bootstrap_inner 中的文件“/usr/lib/python3.6/threading.py”,第 916 行 自我运行() 文件“/usr/lib/python3.6/threading.py”,第 864 行,运行中 self._target(*self._args, **self._kwargs) _handle_results 中的文件“/usr/lib/python3.6/multiprocessing/pool.py”,第 463 行 任务 = 获取() 文件“/usr/lib/python3.6/multiprocessing/connection.py”,第 251 行,在 recv return _ForkingPickler.loads(buf.getbuffer()) 类型错误:init() 缺少 1 个必需的位置参数:'x'
当task 函数返回到池中时再次失败,我猜对象被腌制了?
如果我将OrderedDict 更改为简单的dict,它就可以完美运行......
我有一个解决方法来使用kwargs 并检索感兴趣的属性,但我对一开始的错误感到困惑。有什么想法吗?
【问题讨论】:
标签: python-3.x multiprocessing