Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止中断例程运行多个实例_Python_Interrupt Handling - Fatal编程技术网

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

Python 防止中断例程运行多个实例,python,interrupt-handling,Python,Interrupt Handling,我在树莓皮上使用python和Raspian。我有一个外设连接,使我的中断处理程序功能运行。有时,当对第一个中断的响应尚未完成时,会触发中断。因此,我添加了一个变量,该变量在输入中断函数时设置,在退出时重置,如果在输入函数时,它发现锁已设置,它将立即退出 有没有更标准的方法来处理这类事情 def IrqHandler(self, channel): if self.lockout: return self.lockout = True; # do stuff se

我在树莓皮上使用python和Raspian。我有一个外设连接,使我的中断处理程序功能运行。有时,当对第一个中断的响应尚未完成时,会触发中断。因此,我添加了一个变量,该变量在输入中断函数时设置,在退出时重置,如果在输入函数时,它发现锁已设置,它将立即退出

有没有更标准的方法来处理这类事情

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类的一个实例,然后销毁它,以便后续的中断可以重新实例化它吗?