繁体   English   中英

如何从 Python 中的多进程代理 class 访问 property 属性?

[英]How to access property attribute from multiprocess Proxy class in Python?

我正在尝试从我的代理 class 获取属性,但我不太了解实现(根据https://docs.python.org/3.9/library/multiprocessing.html?highlight=multiprocessing#multiprocessing.managers.BaseManager。注册

我知道我需要将exposedmethod_to_typeid传递给 the.register() 方法,因为如果我不这样做,我只能访问“公共”方法而不是属性。

这是我的代码;

from multiprocessing import Process
from multiprocessing.managers import BaseManager

class CustomManager(BaseManager):
    # nothing
    pass

class TestClass:

    def __init__(self):
       self._items = []

    @property
    def items(self):
        return self._items

    def fill_items(self):
        self._items.append(1)


if __name__ == "__main__":
    CustomManager.register(
        'TestClass', 
        TestClass,
        exposed=('items', 'fill_items'),
        method_to_typeid={'items': 'list'}
    )
    manager = CustomManager()
    manager.start()
    shared_object = manager.TestClass()
    
    p = Process(target=shared_object.fill_items)
    p.start()
    p.join()
    print(shared_object.items)
    #print(shared_object.items())
    

我希望这会返回我的列表,但它会返回对该方法的引用;
Output:

<bound method items of <AutoProxy[TestClass] object, typeid 'TestClass' at 0x7feb38056670>>

但是当我尝试将它作为一种方法调用时,即shared_object.items()我得到了;

File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/managers.py", line 824, in _callmethod
    raise convert_to_error(kind, result)
TypeError: 'list' object is not callable

这是有道理的,因为它是一个包含list类型值而不是方法的属性。 那么,为什么当我尝试将其作为属性调用时,我得到的是它的引用而不是值?

尝试按照官方文档并检查已经提出的问题,其中大部分解决方案是添加 NamespaceProxy,但现在看起来不是实现我们自己的 NamespaceProxy,正确的方法是传递两个额外的参数 for.register() 方法.

这里的解决方案只是使用threading而不是multiprocessing ChatGPT 非常接近我需要的实现,但如果不更改我的类的实现就无法解决问题。 最后,无论如何使用线程更有意义,因为;

  • 线程共享 memory 而不是进程
  • 我的脚本是 I/O 绑定的,这建议使用线程,而 CPU 绑定的应该使用进程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM