描述
当我们的脚本程序进入死循环或者卡在某个耗时操作,需要退出程序时,一般都是使用Ctrl+C来杀死进程,那么,如何在程序里进行这个操作呢?实际上,在命令行输入Ctrl+C的原理是触发了 SIGINT 信号,所以我们需要捕捉这个信号。
signal模块
使用signal模块开捕捉信号, 并使用sys的exit方法退出程序。
处理死循环
import signal
import sys
import time
def quit(signum, frame):
sys.exit(0)
if __name__ == "__main__":
## SIGINT 终止进程 中断进程
signal.signal(signal.SIGINT, quit)
## signal.signal(signal.SIGTERM, quit)
while True:
time.sleep(1)
处理IO/耗时操作
不同于死循环,在单进程单线程的情况下,如果程序卡在某个IO操作或者耗时操作,Python无法捕捉到signal信号(得处理完当前任务才可以)。
这就需要多线程来处理问题,当然因为GIL的原因,这里的多线程也只是单核多线程。
import time
import signal
import sys
import threading
def quit(signum, frame):
print("Bye!")
sys.exit(0)
def work():
time.sleep(99999)
def main():
work_thread = threading.Thread(target=work)
work_thread.daemon = True
work_thread.start()
signal.signal(signal.SIGINT, quit)
print("Start Working")
while True:
time.sleep(1)
if __name__ == "__main__":
main()