iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python3如何实现捕获Ctrl+C终止信号
  • 350
分享到

Python3如何实现捕获Ctrl+C终止信号

Python 2023-05-21 13:05:38 350人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

技术背景针对长时间运行的python程序,例如服务器的后端或科学计算程序,需要特别关注。在进行某些操作时,如使用Ctrl+C结束正在运行的程序,我们可能需要提前中止。通常情况下,出现这种情况有两种可能性:一种是程序出错,需要停止程序以进行调

技术背景

针对长时间运行的python程序,例如服务器后端或科学计算程序,需要特别关注。在进行某些操作时,如使用Ctrl+C结束正在运行的程序,我们可能需要提前中止。通常情况下,出现这种情况有两种可能性:一种是程序出错,需要停止程序以进行调整。另一种是程序本身是正确的,但是程序运行的速度太慢了,也有可能是想提前结束,这种场景下很多时候我们是希望可以保留其相应的计算结果的。但是如果我们使用的是一些第三方的数据存储格式来存储数据,不一定可以支持连续的存储,非常常见的是在程序执行结束之后,再将结果进行保存。如果程序在中途被终止,需要采取特殊手段来保存它的结果。

基础案例

我们先来看一个比较简单的案例:一个普通的打印数字的程序,每隔1s的时间就打印一个数字出来,我们可以使用Python的signal.signal来捕获这个终止信号。

# signal_exit.py
import signal
import sys
 
def signal_handler(signal, frame):
    print ('\nSignal Catched! You have just type Ctrl+C!')
    sys.exit(0)
 
if __name__ == '__main__':
    import time
 
    signal.signal(signal.SIGINT, signal_handler)
    for x in range(100):
        time.sleep(1)
        print (x)

当我们运行这个程序到一半时,同时按下Ctrl+C,我们会得到如下的结果:

$ python3 signal_exit.py
0
1
2
^C
Signal Catched! You have just type Ctrl+C!

这个结果表明,我们在程序运行的过程中捕获到了Ctrl+C的这个外部操作,并且对该操作进行了相应的处理之后,才终止了程序的运行。需要注意的是,如果此时不加上sys.exit(0)这个终止的操作,这个程序不会被停止,会继续运行下去,相当于只是捕获了异常终止信号但不做任何的处理。

给终止信号传入外部参数

在上面的一个案例中,仅仅只是捕获了“终止运行”的这个外部信号,但是如果更进一步的,我们想捕获到最后一个输出的数字是多少,这个时候要如何操作呢?signal.signal函数本身并不支持很多的参数传入,此时建议采取的是自行创建一个类,将signal_handler函数封装为类的成员函数,这样我们就可以获取到相应的内部参数,如下面这个案例所示:

# signal_exit.py
import signal
import sys
import time
 
class Printer:
    def __init__(self):
        self.x = 0
        signal.signal(signal.SIGINT, self.signal_handler)
 
    def signal_handler(self, signal, frame):
        print ('\nSignal Catched! You have just type Ctrl+C! The last number is: {}'.fORMat(self.x))
        sys.exit(0)
 
    def run(self, counter=10):
        while self.x < counter:
            print (self.x)
            time.sleep(1)
            self.x += 1
 
if __name__ == '__main__':
    printer = Printer()
    printer.run(counter=100)

此时如果在程序正在运行的状态下同时按下Ctrl+C,得到的结果如下:

$ python3 signal_exit.py
0
1
2
3
^C
Signal Catched! You have just type Ctrl+C! The last number is: 3

可以看到,我们成功的捕获到了最后一个被输出出来的参数。

以上就是Python3如何实现捕获Ctrl+C终止信号的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Python3如何实现捕获Ctrl+C终止信号

本文链接: https://www.lsjlt.com/news/215336.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python3实现捕获Ctrl+C终止信号
    目录技术背景基础案例给终止信号传入外部参数总结概要技术背景 对于一些连续运行或者长时间运行的Python程序而言,如服务器的后端,或者是长时间运行的科学计算程序。当我们涉及到一些中途...
    99+
    2023-03-13
    Python捕获Ctrl+C终止信号 Python Ctrl+C终止信号 Python捕获信号
  • Python3如何实现捕获Ctrl+C终止信号
    技术背景针对长时间运行的Python程序,例如服务器的后端或科学计算程序,需要特别关注。在进行某些操作时,如使用Ctrl+C结束正在运行的程序,我们可能需要提前中止。通常情况下,出现这种情况有两种可能性:一种是程序出错,需要停止程序以进行调...
    99+
    2023-05-21
    Python
  • Linux如何实现信号捕捉
    这篇文章主要介绍了Linux如何实现信号捕捉,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。##signal函数函数原型:sighandler_t signal(in...
    99+
    2023-06-15
  • 是否可以捕获 Ctrl+C 信号 (SIGINT) 并以“延迟”方式运行清理函数?
    php小编鱼仔在这篇文章中将为大家解答一个常见的问题:“是否可以捕获 Ctrl+C 信号 (SIGINT) 并以‘延迟’方式运行清理函数?”在编写 PHP 脚本时,我们经常需要处理一些...
    99+
    2024-02-09
  • 在脚本中如何使用Bash信号捕获
    这篇文章将为大家详细讲解有关在脚本中如何使用Bash信号捕获,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚...
    99+
    2023-06-15
  • C/C++如何获取CAN信号
    本篇内容主要讲解“C/C++如何获取CAN信号”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++如何获取CAN信号”吧!CAN基础知识标准的CAN 数据为8字节,即64位,但是CAN FD...
    99+
    2023-07-05
  • C/C++关于实现CAN信号的获取方法
    目录CAN基础知识CAN 信号C语言涉及到知识CAN基础知识 标准的CAN 数据为8字节,即64位,但是CAN FD的最大数据可为64字节,为512位,其中的帧ID分为标准帧和扩展帧...
    99+
    2023-02-03
    C++ CAN信号 C++ CAN信号获取 C语言CAN信号
  • Java利用Exception如何实现捕获并显示
    Java利用Exception如何实现捕获并显示?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java Exception 捕获和显示实例详解  在进行Java B/...
    99+
    2023-05-31
    java exception ava
  • Python如何实现获取微信企业号access_token的Class
    小编给大家分享一下Python如何实现获取微信企业号access_token的Class,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一...
    99+
    2024-04-02
  • JavaScript中如何实现事件冒泡与时间捕获
    小编给大家分享一下JavaScript中如何实现事件冒泡与时间捕获,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、事件冒泡与事件捕获当我们在Web页面单击某一个元素的时候,比如某个p元素...
    99+
    2024-04-02
  • JS如何实现禁止用户使用Ctrl+鼠标滚轮缩放网页
    这篇文章主要为大家展示了“JS如何实现禁止用户使用Ctrl+鼠标滚轮缩放网页”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何实现禁止用户使用Ctrl+鼠标...
    99+
    2024-04-02
  • 如何实现Javascript事件的捕获方式和冒泡方式
    这篇文章将为大家详细讲解有关如何实现Javascript事件的捕获方式和冒泡方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、事件处理模型事件冒泡、捕获:事件冒泡和事件捕获分别由微软和网景公司提出,这...
    99+
    2023-06-22
  • C++中如何实现信号量以同步多个进程
    在C++中实现信号量可以使用std::mutex和std::condition_variable来实现。下面是一个简单的示例代码来展...
    99+
    2024-04-02
  • 微信公众号开发中使用Java如何实现获取用户的信息
    微信公众号开发中使用Java如何实现获取用户的信息?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先需要到微信网站去设置一下,我是直接用的微信测试号。        接口配...
    99+
    2023-05-31
    java 微信公众号 用户信息
  • Java中的线程如何实现通过关闭Socket终止
    这篇文章将为大家详细讲解有关Java中的线程如何实现通过关闭Socket终止,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体内容如下package Threads;import java....
    99+
    2023-05-31
    java socket 终止线程
  • DISM如何修改WDS启动镜像实现自动捕获镜像
    这篇文章给大家分享的是有关DISM如何修改WDS启动镜像实现自动捕获镜像的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  前些日子在做windows OS自动部署的各种测试,用的是微软免费的WDS功能,因为是测试...
    99+
    2023-06-14
  • C#如何实现串口通信
    这篇文章主要讲解了“C#如何实现串口通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现串口通信”吧!1.基本概念2.前端winForm布局如下(仅仅为了实现功能,布局略丑)3.代...
    99+
    2023-06-29
  • C++如何实现即时通信
    本篇内容主要讲解“C++如何实现即时通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++如何实现即时通信”吧!软件:VS服务器端//TcpServer_plus.exe#include<...
    99+
    2023-06-30
  • 如何实现禁止指定QQ号登录的bat
    这篇文章主要介绍了如何实现禁止指定QQ号登录的bat,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:@echo off color f0...
    99+
    2023-06-08
  • 微信公众号如何实现电商变现
    这篇文章主要为大家展示了“微信公众号如何实现电商变现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信公众号如何实现电商变现”这篇文章吧。对于大部分公众号,内容变现是一个大问题。很多公众号会采用...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作