Python 防止中断例程运行多个实例
我在树莓皮上使用python和Raspian。我有一个外设连接,使我的中断处理程序功能运行。有时,当对第一个中断的响应尚未完成时,会触发中断。因此,我添加了一个变量,该变量在输入中断函数时设置,在退出时重置,如果在输入函数时,它发现锁已设置,它将立即退出 有没有更标准的方法来处理这类事情Python 防止中断例程运行多个实例,python,interrupt-handling,Python,Interrupt Handling,我在树莓皮上使用python和Raspian。我有一个外设连接,使我的中断处理程序功能运行。有时,当对第一个中断的响应尚未完成时,会触发中断。因此,我添加了一个变量,该变量在输入中断函数时设置,在退出时重置,如果在输入函数时,它发现锁已设置,它将立即退出 有没有更标准的方法来处理这类事情 def IrqHandler(self, channel): if self.lockout: return self.lockout = True; # do stuff se
def IrqHandler(self, channel):
if self.lockout: return
self.lockout = True;
# do stuff
self.lockout = False;
你可以用博格图案来搭配。这样,您可以有多个中断实例关注一个状态。 还有一个叫做singleton,但这里有一个关于这两个的讨论。
如果调用
IrqHandler
两次足够接近,则两次调用都可以将self.locket
视为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()
你的方法似乎很好。我不确定这是否可能,因为我没有使用rpi的经验,但是如果锁定为真,有没有一种方法可以防止首先调用该方法?阻塞线程可能不是最好的响应,因为它会阻止第一个中断处理程序的执行。@markranson,这取决于应用程序。例如,如果您已经在处理报警情况,则可以忽略类似报警的触发器。您好,谢谢,但我发现了一个错误:
TypeError:allocate\u lock()不带参数(1给定)
您使用的是python 3还是其他什么(我想我应该说我使用的是python 2)我认为'False'参数应该出现在acquire()而不是Lock()self的调用中。irq_local应该是self.irq_lockThank的一个拼写错误,但我不明白在我的情况下如何使用它。你的意思是我应该创建singelton类的一个实例,然后销毁它,以便后续的中断可以重新实例化它吗?