【问题标题】:multiprocessing.Pool cannot return OrderedDict subclass with additional argumentmultiprocessing.Pool 不能返回带有附加参数的 OrderedDict 子类
【发布时间】: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


    【解决方案1】:

    您可以为您的类定义__getstate__()__setstate__() 方法。

    在这些函数中,您可以确保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 中,它已成为该语言的一部分。

    【讨论】:

    • getstatesetstate 很感兴趣。你能详细说明如何做吗?至于保持顺序的字典,我很高兴看到它终于成为语言的一部分!我记得 3.6 说我们不应该依赖它。它使事情变得更简单。
    猜你喜欢
    • 2021-08-09
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2017-07-16
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多