当我们的脚本程序进入 死循环 或者卡在某个 耗时操作 ,需要退出程序时,一般都是使用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()
                    描述当我们的脚本程序进入死循环或者卡在某个耗时操作,需要退出程序时,一般都是使用Ctrl+C来杀死进程,那么,如何在程序里进行这个操作呢?实际上,在命令行输入Ctrl+C的原理是触发了 SIGINT 信号,所以我们需要捕捉这个信号。signal模块使用signal模块开捕捉信号, 并使用sys的exit方法退出程序。处理死循环import signalimport sysimport...
# 设置相应信号处理的handler
signal.signal(signal.SIGINT, my_handler)    #读取Ctrl+c信号
# signal.signal(signal.SIGHUP, my_handler)    
# signal.signal(signal.SI.
				
训练model时可能会在中间时刻停止训练,如果想要停止信号发出后,继续执行剩下的代码,可以使用下述方式: model.learn(total_timesteps=int(trian_steps), callback=callback) except KeyboardInterrupt: model.save(log_dir + "{}-{}-{}".format(algo, ...
def make_pizza(toppings): #形参名toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装在内 print(toppings,type(toppings)) make_pizza(‘a’) make_pizza(‘b’,‘c’,‘d’) def build_profile(first,last,user_info):#形参user_info中的两个星号让Python创建一个名为user_info的空字典 profile={} profile
python多进程编程中,一般通过标准库multiprocessing实现,对此,既可以通过Process类实现,也可以通过进程池Pool实现。本文解决的问题是针对Pool的,因为只有在使用进程池时才会出现ctrl c无法正常退出程序,而使用Process类实现时ctrl c可以中止程序退出。 在python的多进程编程中,有时候当程序正在执行的时候,我们希望通过c...
# Time : 2021/3/19 16:34 '''已知执行一个程序时,输入Ctrl+C就会中断程序,终止程序 模拟场景:一个函数生产数据,生产满100000次时,数据入库,流程结束 因特殊原因,紧急要求停止生产数据,如果直接使用Ctrl+C就会中断程序,导致生成的数
电脑是解决众多问题的工具,尤其对于程序员而言,拥有一套快捷方式,在编程时,可以事半功倍,从而高效地完成工作任务,今天就带来一套快捷方式,仅供大家参考: 一、常见快捷方式: 1、系统自带的快捷方式 win+R : 打开命令行窗口,例如在窗口输入cmd命令进入管理员运行窗口。 win+tab键 :进入预览模式,切换工作窗口 ctrl+tab键: 切换网页。 win+D:缩小窗口 ctrl+shift:切换输入法 shift:快速切换中英文 1~2数字键:输入时选择想要输入的字。例如:“即”字,按住1,即可选择“
Python中,我们可以使用`KeyboardInterrupt`异常来模拟Ctrl+C的效果,这个异常会在用户按下Ctrl+C时被抛出。我们可以使用try-except语句来捕获这个异常并在异常处理程序中执行我们需要的操作。 下面是一个例子,当用户按下Ctrl+C时,程序会输出一条消息并退出: ```python import signal def signal_handler(signal, frame): print('You pressed Ctrl+C!') exit(0) signal.signal(signal.SIGINT, signal_handler) print('Press Ctrl+C to exit') while True: 在这个例子中,我们使用了`signal`模块来注册一个信号处理程序,当用户按下Ctrl+C时,这个信号处理程序会被执行。在信号处理程序中,我们输出了一条消息并调用`exit()`函数来退出程序
你好,我测试了下,发现貌似还是没法自动退出进程啊? 我是多线程 + 多进程的操作: [code=python]for device_id in devices_info.keys(): t = Thread(target=get_frame, args=(devices_info[device_id]['uri'], q_image, device_id)) t.daemon = True # 跟随主进程一起退出 p = Process(target=model_infer, args=(q_image, q_infer, models_info, devices_info)) p.daemon = True t.start() camera_threads.append(t) p.start() infer_processes.append(p) signal.signal(signal.SIGINT, quit) [/code] 我是哪里不对么?
Firefox火狐配置简洁主页和新标签页 yeeanna: 感谢!终于没有下面的新闻让我分心了 Firefox火狐配置简洁主页和新标签页 设置了一下,确实舒服了。就是壁纸加载的慢,白光一闪有些烦人。 【算法】【PAT】1011-1020 博主辛苦了!!感谢博主,博客有空看看我的!