Python3 多处理或多线程方式并行使用 getter/setter

Python3 multiprocessing or multithreading way to use getter/setter in parallel

假设我有 classes,我将属性定义为 getter/setter。 类 是这样的:

class TestClass:
    def __init__(self):
        self.name = "default name"

    @property
    def myname(self):
        self._myname = self.name
        return self._myname

    @myname.setter
    def myname(self, n):
        self._myname = n
        self.name = self._myname

我实例化了这些 classes。在这个例子中,我多次实例化相同的 class:

a = TestClass()
a.myname = "A"
b = TestClass()
b.myname = "B"

设置和获取这些名称需要一定的时间。

如何并行获取 a.mynameb.myname? 如何并行设置 a.myname = "new A"b.myname = new B

我看到的here, here, here and heremultiprocessingmultithreading的例子只涉及函数或标准的class方法。 此外,基于 ray 的解决方案显然不允许访问 class 属性。

回答您如何将属性用作函数

如果需要,您可以直接访问底层 getter 和 setter 函数,并手动将实例传递给它们,例如替换:

a.myname = "A"

与:

type(a).myname.fset(a, "A")

为了更简单的使用,您可以将函数公开为函数和 propertys,例如:

class TestClass:
    def __init__(self):
        self.name = "default name"

    def get_myname(self):
        self._myname = self.name
        return self._myname

    def set_myname(self, n):
        self._myname = n
        self.name = self._myname

    myname = property(get_myname, set_myname)

所以你可以直接替换:

a.myname = "A"

与:

a.set_myname("A")

无需手动绕过描述符协议,同时仍允许 a.myname = "A" 在并行处理不需要时继续工作。

在这里解决 XY 问题

综上所述,这是一个糟糕的属性用例。通常,属性应该是低开销的,因为从使用它们阅读代码的人的角度来看,它们 看起来 像属性访问并且应该大致像属性访问一样,例如它们不需要比常规属性访问多多个数量级的时间来访问。如果你的“属性”需要非本地网络操作,不适合充当属性;使用专用的 getter 和 setter 功能,并且根本不提供 属性,因此您的 API 的消费者不会被欺骗,认为访问可以很便宜地完成。通过不使用属性,您的问题就消失了;你回到了可以并行化的方法。