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说过我们不应该依赖它。它使事情变得简单得多。