当发生异常时,我想在没有部分处理数据的情况下干净地退出。这是我正在尝试的那种代码:
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什么都不做。
确保干净退出的正确方法是什么?
答案 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
来终止进程而无需等待。