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.myname
和 b.myname
?
如何并行设置 a.myname = "new A"
和 b.myname = new B
?
我看到的here, here, here and here和multiprocessing
、multithreading
的例子只涉及函数或标准的class方法。
此外,基于 ray
的解决方案显然不允许访问 class 属性。
回答您如何将属性用作函数
如果需要,您可以直接访问底层 getter 和 setter 函数,并手动将实例传递给它们,例如替换:
a.myname = "A"
与:
type(a).myname.fset(a, "A")
为了更简单的使用,您可以将函数公开为函数和 property
s,例如:
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 的消费者不会被欺骗,认为访问可以很便宜地完成。通过不使用属性,您的问题就消失了;你回到了可以并行化的方法。
假设我有 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.myname
和 b.myname
?
如何并行设置 a.myname = "new A"
和 b.myname = new B
?
我看到的here, here, here and here和multiprocessing
、multithreading
的例子只涉及函数或标准的class方法。
此外,基于 ray
的解决方案显然不允许访问 class 属性。
回答您如何将属性用作函数
如果需要,您可以直接访问底层 getter 和 setter 函数,并手动将实例传递给它们,例如替换:
a.myname = "A"
与:
type(a).myname.fset(a, "A")
为了更简单的使用,您可以将函数公开为函数和 property
s,例如:
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 的消费者不会被欺骗,认为访问可以很便宜地完成。通过不使用属性,您的问题就消失了;你回到了可以并行化的方法。