python中变量更改时的回调

2024-06-01 09:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我到处找了找,但没有找到这样的东西。假设我有一大群线程,它们不断地读取和更新一个整型变量x。当x超过某个边距(比如500)时,我想要一个回调来运行回调。在

如何在不给系统带来沉重负担的情况下完成这项工作,比如让一个线程拥有一个while true并检查变量是否已更改?性能至关重要。但道德也是如此。在

在纯代码中应该是这样的:

x = 10
def runMe():
    print('Its greater than 500!!') 

def whenToRun():
    return x >= 500

triggers.event(runMe, whenToRun)

Tags: 代码true系统def情况性能线程its
2条回答

如果x是某个对象的属性,而不是全局变量,那么这非常简单:添加一个^{}方法:

class MyType:
    def __setattr__(self, name, value):
        if name == 'x':
            self.x_callback(value)
        super().__setattr__(name, value)

显然,您可以通过以下方法使其更加灵活:

  • 添加一种动态注册条件的方法,而不是总是调用x_callback。在
  • 让它成为一个mixin类,它可以附加到任何其他类上,让您register(name, callback)任意选择。在
  • 结合以上内容,这样您就可以register(name, condition, callback)。在
  • self.x_callback(oldval=self.x, newval=value)以便回调可以看到旧值和新值。在
  • if self.x_callback(value):因此回调可以接受或拒绝更改。在
  • value = self.x_callback(value)因此回调可以覆盖更改。在

您希望有一个函数(a“setter”),每当变量的值发生变化时都会调用该函数。一个好的方法是定义一个@property。它的行为类似于一个变量,但有一个getter函数和一个setter函数。在

然后,在setter中,调用您需要的任何回调,它将对更改做出反应。在

这应该可以做到:

class ObjectHoldingTheValue:
    def __init__(self, initial_value=0):
        self._value = initial_value
        self._callbacks = []

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        old_value = self._value
        self._value = new_value
        self._notify_observers(old_value, new_value)

    def _notify_observers(self, old_value, new_value):
        for callback in self._callbacks:
            callback(old_value, new_value)

    def register_callback(self, callback):
        self._callbacks.append(callback)

然后,您可以:

^{pr2}$

相关问题 更多 >