通过注册信号处理程序,我可以将我的清理代码放在signal_handler
中signal.signal(signal.SIGINT, signal_handler)
但问题是当用户多次按下ctrl + c时,信号处理程序会多次运行并且清理会变得疯狂。
我的问题是,我怎样才能确保清理处理程序只在退出之前运行一次。
这是我使用锁定的试用版,但发生了死锁
def cleanup_handler():
lock.acquire()
if not done:
try:
cleanup()
done = True
finally:
print "release lock"
lock.release()
问题是最终阻止永远不会被运行(即我无法看到"释放锁定"正在打印)。
备注
在做了一点实验之后,似乎信号处理程序没有同时运行。收到新的Ctrl + C后,将终止旧处理程序并运行新的处理程序。我对么?如果是的话,问题变得更加复杂,因为我不希望我的处理程序在...的中间结束。
答案 0 :(得分:0)
您可以使用装饰器来阻止您的函数多次运行:
from functools import wraps
def run_once(function):
@wraps(function)
def wrapper(*args):
if not wrapper.has_run:
wrapper.has_run = True
return function()
wrapper.has_run = False
return wrapper
像这样:
@run_once
def signal_handler():
print 'Exit'