我在Raspberry pi上使用带有Raspian的python。我有一个外设附加,导致我的中断处理函数运行。有时,当第一个中断的响应尚未完成时,中断会被触发。所以我添加了一个在输入中断函数时设置的变量,并在退出时复位,如果在进入函数时,它发现锁定已设置,它将立即退出。
是否有更标准的方式处理此类事情。
def IrqHandler(self, channel):
if self.lockout: return
self.lockout = True;
# do stuff
self.lockout = False;
答案 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