0

通过注册信号处理程序,我可以将清理代码放入 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()

问题是 finally 块永远不会运行(也就是说我看不到正在打印“释放锁”)。

备注
做了一个小实验后,似乎不是同时运行信号器处理程序。当收到新的 Ctrl+C 时,旧的处理程序被杀死并运行一个新的处理程序。我对么?如果是,问题会变得更加复杂,因为我不希望我的处理程序在....

4

1 回答 1

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'
于 2012-10-02T07:45:13.097 回答