防止中断例程运行多个实例

时间:2013-09-24 17:44:48

标签: python interrupt-handling

我在Raspberry pi上使用带有Raspian的python。我有一个外设附加,导致我的中断处理函数运行。有时,当第一个中断的响应尚未完成时,中断会被触发。所以我添加了一个在输入中断函数时设置的变量,并在退出时复位,如果在进入函数时,它发现锁定已设置,它将立即退出。

是否有更标准的方式处理此类事情。

def IrqHandler(self, channel):
    if self.lockout: return
    self.lockout = True;
    # do stuff
    self.lockout = False;

2 个答案:

答案 0 :(得分:2)

如果IrqHandler被召唤两次足够接近,您就会遇到竞争条件,两次调用都可以将self.lockout视为False并继续将其设置为True

threading模块有一个Lock()对象。通常(默认值),这用于阻止线程,直到锁被释放。这意味着所有中断都将排队并轮流运行处理程序。

如果已获得锁定,您还可以创建Lock(False),只返回False。这接近你在这里使用

from threading import Lock

def __init__(self):
    self.irq_lock = Lock(False)

def IrqHandler(self, channel):
    if not self.irq_lock.acquire():
        return
    # do stuff
    self.irq_local.release()

答案 1 :(得分:0)

您可以将其与borg模式联系起来。这样你可以有几个中断实例关注一个状态。 还有一个叫做单身人士,但这里是对这两个人的讨论。 Why is the Borg pattern better than the Singleton pattern in Python