在python中捕获Ctrl + C时清理代码

时间:2012-10-02 07:32:56

标签: python multithreading concurrency

通过注册信号处理程序,我可以将我的清理代码放在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后,将终止旧处理程序并运行新的处理程序。我对么?如果是的话,问题变得更加复杂,因为我不希望我的处理程序在...的中间结束。

1 个答案:

答案 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'