Python 3.x 多处理。池无法返回带有附加参数的OrderedDict子类

Python 3.x 多处理。池无法返回带有附加参数的OrderedDict子类,python-3.x,multiprocessing,Python 3.x,Multiprocessing,我试图创建一个简单的orderedict子类,该子类由池创建,然后返回 将创建的对象返回池时的pickle过程似乎试图重新实例化该对象,但由于\uuuuu init\uuu函数中需要的附加参数而失败 这是一个最小(非)工作示例: from collections import OrderedDict from multiprocessing import Pool class Obj1(OrderedDict): def __init__(self, x, *args, **kwar

我试图创建一个简单的
orderedict
子类,该子类由
池创建,然后返回

将创建的对象返回池时的pickle过程似乎试图重新实例化该对象,但由于
\uuuuu init\uuu
函数中需要的附加参数而失败

这是一个最小(非)工作示例:

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)
如果我这样做,我会得到以下错误

线程3中的异常: 回溯(最近一次呼叫最后一次): 文件“/usr/lib/python3.6/threading.py”,第916行,在内部引导中 self.run() 文件“/usr/lib/python3.6/threading.py”,第864行,运行中 自我目标(*自我参数,**自我参数) 文件“/usr/lib/python3.6/multiprocessing/pool.py”,第463行,在“handle”结果中 task=get() recv中的文件“/usr/lib/python3.6/multiprocessing/connection.py”,第251行 return _ForkingPickler.load(buf.getbuffer()) TypeError:init()缺少1个必需的位置参数:“x”

任务
函数返回池并且我猜对象被pickle时,这会再次失败吗

如果我用一个简单的
dict
更改了
OrderedDict
,它会完美地工作


我有一个变通方法可以使用
kwargs
并检索感兴趣的属性,但我一开始就被错误难住了。有什么想法吗?

你可以为你的类定义
\uu getstate\uuuuu()
\uuuu setstate\uuuuu()
方法

在这些函数中,您可以确保
x
也被处理。例如:

def __getstate__(self):
    return self.x, self.items()

def __setstate__(self, state):
    self.x = state[0]
    self.update(state[1])

顺便说一句,在CPython 3.6中,没有理由使用
OrderedDict
,因为字典顺序是插入顺序。这最初是CPython中的一个实现细节。在Python 3.7中,它是语言的一部分。

您可以为类定义
\uu getstate\uuuuuu()
\uuuuu setstate\uuuu()
方法

在这些函数中,您可以确保
x
也被处理。例如:

def __getstate__(self):
    return self.x, self.items()

def __setstate__(self, state):
    self.x = state[0]
    self.update(state[1])
顺便说一句,在CPython 3.6中,没有理由使用
OrderedDict
,因为字典顺序是插入顺序。这最初是CPython中的一个实现细节。在Python 3.7中,它是语言的一部分。

getstate和setstate很有趣。你能详细说明一下怎么做吗?至于保持秩序的口述,我很高兴看到它终于成为语言的一部分了!我记得3.6说过我们不应该依赖它。它使事情变得更简单。getstate和setstate很有趣。你能详细说明一下怎么做吗?至于保持秩序的口述,我很高兴看到它终于成为语言的一部分了!我记得3.6说过我们不应该依赖它。它使事情变得简单得多。