0

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

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 什么都不做。

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

4

1 回答 1

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在不等待的情况下第二次击杀进程。

于 2015-03-06T22:42:47.073 回答