2015-10-14 79 views
0

我正在Debian上開發一個Python應用程序,當它從ether正常操作或可捕獲信號調用關閉時,需要一些清理函數。下面是一些psudocode:防止Python3中信號處理的競爭條件

def exitHandler(sign, frame) 
    ... 
    variousCleanUp commands 
    ... 
    program ends here 

def main() 
    signal.signal(SIGINT, exitHandler) 
    signal.signal(SIGTERM, exitHandler) 

問題的,這是我所檢測到關閉程序時,會導致兩個SIGINT和SIGTERM發送。因此,exitHandler函數被調用兩次,這不應該發生。

我能做些什麼來防止這種情況發生?

回答

1

設置一個標誌

execution = False 

def exitHandler(sign, frame): 
    global execution 
    if execution: 
     return 
    execution = True 
    ... # Rest of the code here 

,如果你有真正的併發性,使用threading.Lock

... 
lock_obj = threading.Lock() 
... 

def exitHandler(sign, frame): 
    with lock_obj: 
     ...