具有关联对象的 Python 多处理自定义管理器

标签 python python-3.x python-multiprocessing custom-object multiprocessing-manager

我正在尝试使类对象可用于多个进程。不幸的是,这似乎比我预想的更严重。

我有以下类对象:

class BusObject:

    inputs: IOObject
    outputs: IOObject

    def __init__(self):
        self.inputs = IOObject()
        self.outputs = IOObject()

与关联对象IOObject

class IOObject:

    idx: List[int]              # signal index
    tag: List[str]              # signal tag

    def __init__(self):

        self.idx = []
        self.tag = []

这个组合效果很好。但现在我遇到了必须使 BusObject 可用于多个进程的要求。

因此我创建了一个自定义的 multiprocessing.manager

class CustomManager(BaseManager):
    pass

def main():

    manager = CustomManager()

    # Registration of custom classes to manager
    manager.register('BusObject', BusObject)
    # manager.register('IOObject', IOObject)

    manager.start()
    
    busObject = manager.BusObject()

有效 - 几乎...

问题是关联的对象似乎也没有注册。

我也尝试注册它们,但即使我这样做了,我也会遇到错误

AttributeError
'AutoProxy[BusObject]' object has no attribute 'inputs'

有什么想法吗?

最佳答案

阅读此处的文档后 - https://docs.python.org/3/library/multiprocessing.html#multiprocessing.managers.BaseManager.register - 我想说你将无法直接访问 .inputs.outputs 属性 - 你可以像这样编码你的对象,以及“所有者”进程真实 BusObject 实例的实例可以这样做 - 但为了获取与 BUSObject 关联的 IOObject 实例(顺便说一句,您缺少的术语是this:关联对象,而不是“嵌套子类”) - 您必须通过在调用 .register()method_to_typeid 参数中注册的方法来检索 then。

所以,你会这样做

    ...
    def get_inputs(self):
        return self.inputs
    # same for outputs...

方法(否则在 Python 中看起来很愚蠢),并传递 {'get_inputs': 'IOObject', 'get_outputs': 'IOObject'} 作为 method_to_typeid 参数调用电话进行注册。

这样,注册类的其他默认设置将为 BUSObject 创建一个代理,当您调用这些方法时,该代理将能够将代理返回给 IOObject(但 busobj_instance.inputs 应保持不透明)。

这甚至可以与 @property 一起使用,这样您就可以将属性 getter 方法注册为代理返回器,并能够使用名称作为属性。

当然,IOOBject 类也必须正确注册。

很抱歉没有提供有效的示例并测试可能性 - 但这至少需要我几个小时才能开始。

关于具有关联对象的 Python 多处理自定义管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74068361/

相关文章:

python - 对于排序数组来说,更快地替代 np.where

python - 为什么我会收到 "unwanted"日志条目?

Python multiprocessing - 捕获信号以重新启动子进程或关闭父进程

python - 如何在Python中对事件监听器和函数应用多处理?

python - 整数输入验证Python

python - 在 Tkinter 中向一组小部件添加滚动条

python - 当我在迭代器上调用 list() 时,Python 3 中发生了什么?

python - 在保持值(value)的同时在循环内进行比较

Python 多处理-为已完成的进程分配新函数?

java - 身份验证方法