无法从回调函数更改/编辑类属性/变量

时间:2014-09-22 23:17:21

标签: python callback thread-safety

我试图从回调函数更改类的属性,但属性的值总是等于它初始化的值,即为0。

class Rainfall:
    def __init__(self):
        self.rainHalfHourCounter = 0

    def incrementRain(self,channel):
        self.rainHalfHourCounter = self.rainHalfHourCounter + 1
        print "incrementRain ",self.rainHalfHourCounter

    rainfall = Rainfall()
    GPIO.add_event_detect(11, GPIO.BOTH,  callback = rainfall.incrementRain,bouncetime = 200)

    while True:
        print self.rainHalfHourCounter

incrementRain函数是回调函数。此功能设置为我的一个RPi gpio引脚上的中断(但基本上只是一个回调函数)。 incrementRain函数中的值会发生变化,但class属性不会更改,因此我无法使用self.rainHalfHourCounter函数之外的incrementRain。 while循环中的打印行始终打印0.它从不递增。这是线程安全的问题吗?这个问题可能有一个简单的解决方案吗?

非常感谢任何帮助/简短示例代码。

1 个答案:

答案 0 :(得分:0)

以下是Rainfall.incrementRain作为回调的示例用法,它完全正常。

class Rainfall:
    def __init__(self):
        self.rainHalfHourCounter = 1

    def incrementRain(self,channel):
        self.rainHalfHourCounter = self.rainHalfHourCounter + 1
        print "incrementRain ",self.rainHalfHourCounter


class TestCallback(object):
    def __init__(self):
        self.callbacks = []
    def addCallback(self, callback):
        self.callbacks.append(callback)
    def run(self, *args):
        for func in self.callbacks:
            #invoke all callbacks with passed in arguments
            func(*args)

t = TestCallback()
#First call, should output 1
r=Rainfall()
r.incrementRain(None)
t.addCallback(r.incrementRain)

#Callback, should output 2
t.run(None)

输出:

incrementRain  2
incrementRain  3