在Ctrl + C上干净地退出

时间:2015-03-06 22:12:50

标签: python locking signals code-cleanup keyboardinterrupt

当发生异常时,我想在没有部分处理数据的情况下干净地退出。这是我正在尝试的那种代码:

exit_lock = threading.lock()
def sig_interrupt_handler(signal, frame):
    with exit_lock:
        sys.exit(0)

signal.signal(signal.SIGINT, sig_interrupt_handler)

while data_left() > 0:
    with exit_lock:
        data = fetch_data(10)
        for datum in data:
            processor = Processor(datum)
            processor.process()
            datum.delete()

但是,当按下ctrl + c时,此代码会导致我的程序锁定。我试过让中断处理程序关闭一个新线程,但这会导致ctrl + c什么都不做。

确保干净退出的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您面临的问题是您正在陷入僵局。在您的代码中,只有一个线程:主应用程序。它在while循环中持有一个锁,当你点击Ctrl+C时,它会死锁,因为中断处理程序正在等待释放锁,因为应用程序被锁定,所以永远不会释放锁中断处理程序,因此while循环没有被执行。

你会有更多的运气来重新安装

do_process = True

def sig_interrupt_handler(signal, frame):
    global do_process
    do_process = False

signal.signal(signal.SIGINT, sig_interrupt_handler)

while data_left() > 0 and do_process:
    data = fetch_data(10)
    for datum in data:
        processor = Processor(datum)
        processor.process()
        datum.delete()

您还可以查看signal.alarm(time)函数,以确保应用程序在最长时间后终止,或者具有类似

的内容
def sig_interrupt_handler(signal, frame):
    global do_process
    if do_process:
        do_process = False
    else:
        sys.exit(-1)

这样用户可以第二次点击Ctrl+C来终止进程而无需等待。