簡體   English   中英

防止中斷例程運行多個實例

[英]Prevent interrupt routine running multiple instances

我在Raspberry pi上使用帶有Raspian的python。 我有一個外設附加,導致我的中斷處理函數運行。 有時,當第一個中斷的響應尚未完成時,中斷會被觸發。 所以我添加了一個變量,該變量在輸入中斷函數時設置並在退出時復位,如果在進入函數時,它發現鎖定已設置,它將立即退出。

是否有更標准的方式來處理這類事情。

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

如果IrqHandler被調用兩次足夠靠近,你有一個競爭條件,兩個調用都可以看到self.lockoutFalse並且兩者都繼續設置為True等。

threading模塊有一個Lock()對象。 通常(默認值),這用於阻止線程,直到鎖被釋放。 這意味着所有中斷都將排隊並輪流運行Handler。

您還可以創建一個Lock(False) ,如果已獲取Lock,它將返回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()

你可以用borg模式綁定它。 這樣你可以有幾個中斷實例關注一個狀態。 還有一個叫做單身人士,但這里是對這兩個人的討論。 為什么Borg模式比Python中的Singleton模式更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM