当前位置: 首页 > news >正文

Python signal 模块详解:优雅处理异步事件

诸神缄默不语-个人技术博文与视频目录

在 Linux 或类 Unix 系统中,信号(Signal)是一种用于进程间通信的机制,允许操作系统或其他进程向目标进程发送异步通知。
Python 的 signal 模块提供了对这些信号的访问和处理能力,使得我们可以在 Python 程序中捕获和响应特定的系统信号。

官方文档:signal — Set handlers for asynchronous events — Python 3.11.5 documentation

文章目录

  • 📦 模块简介
  • 🔧 常用方法和属性
    • 1. `signal.signal(signalnum, handler)`
    • 2. `signal.alarm(seconds)`
    • 3. `signal.pause()`
    • 4. `os.kill(pid, sig)`
  • 🧪 实际应用示例
    • 示例 1:处理用户自定义信号
    • 示例 2:忽略特定信号
  • ⚠️ 注意事项
  • 📚 参考资料

📦 模块简介

signal 模块允许我们:

  • 注册自定义的信号处理函数;
  • 忽略特定的信号;
  • 设置定时器,在指定时间后发送信号;
  • 暂停程序执行,等待信号的到来。

需要注意的是,signal 模块主要在类 Unix 系统(如 Linux、macOS)中使用,某些功能在 Windows 上可能不被支持。

🔧 常用方法和属性

1. signal.signal(signalnum, handler)

用于为指定的信号注册处理。signalnum 是信号编号,handler 是信号处理程序,可以是自定义的函数(接受两个参数:signum 和 frame),也可以是特殊值 signal.SIG_IGN、 signal.SIG_DFL之一。

  • signal.SIG_IGN:忽略该信号;​
  • signal.SIG_DFL:使用默认的信号处理方式。
import signaldef handler(signum, frame):print(f"Received signal: {signum}")signal.signal(signal.SIGINT, handler)

上述代码将 SIGINT(通常由 Ctrl+C 触发)信号绑定到自定义的 handler 函数。

2. signal.alarm(seconds)

设置一个定时器,在指定的秒数后向进程发送 SIGALRM 信号。如果参数为 0,则取消之前设置的定时器。

import signal
import timedef timeout_handler(signum, frame):print("Timeout!")exit(1)signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5)  # 5 秒后触发 SIGALRMtime.sleep(10)

运行上述代码,程序将在 5 秒后打印 “Timeout!” 并退出。

3. signal.pause()

使程序暂停执行,直到接收到一个信号并处理完毕。

import signaldef handler(signum, frame):print(f"Handled signal: {signum}")signal.signal(signal.SIGUSR1, handler)
print("Waiting for signal...")
signal.pause()

执行上述代码后,程序将暂停,直到接收到 SIGUSR1 信号。

4. os.kill(pid, sig)

向指定的进程发送信号。其中 pid 是进程 ID,sig 是信号编号。

import os
import signalos.kill(12345, signal.SIGTERM)

上述代码向进程 ID 为 12345 的进程发送 SIGTERM(终止)信号。

🧪 实际应用示例

示例 1:处理用户自定义信号

import signal
import os
import timedef custom_handler(signum, frame):print(f"Received signal: {signum}")signal.signal(signal.SIGUSR1, custom_handler)
print(f"My PID is {os.getpid()}")while True:print("Waiting...")time.sleep(3)

运行上述代码后,程序将每 3 秒打印一次 “Waiting…”。在另一个终端中,使用以下命令向该进程发送信号:

kill -USR1 <PID>

其中 <PID> 是程序运行时打印的进程ID。发送信号后,程序将调用 custom_handler 函数,打印接收到的信编号。

示例 2:忽略特定信号

import signal
import timesignal.signal(signal.SIGINT, signal.SIG_IGN)
print("Press Ctrl+C. It will be ignored.")while True:time.sleep(1)

运行上述代码后,按下 Ctrl+C,程序不会被中断,因为 SIGINT 信号被忽略了。

⚠️ 注意事项

  • 线程限制signal 模块的信号处理函数只能在主线程中注册和执行。在子线程中注册信号处理函数将引发 ValueError异常。

  • 平台兼容:某些信号(如 SIGALRM)在 Windows 上不被支持,因此相关功能可能无法在 Windows 系统上正常工作。

  • 信号处理的时机:Python 的信号处理是异步的,信号处理函数会在主线程的下一个安全点(如执行字节码指令时)被调用,而不是立即执行。

📚 参考资料

  1. Python 官方文档:signal 模块
  2. Signal:python用信号处理程序的机制及用法举例_signal.signal-CSDN博客
  3. Python之signal模块的使用 - 小粉优化大师 - 博客园

相关文章:

Python signal 模块详解:优雅处理异步事件

诸神缄默不语-个人技术博文与视频目录 在 Linux 或类 Unix 系统中&#xff0c;信号&#xff08;Signal&#xff09;是一种用于进程间通信的机制&#xff0c;允许操作系统或其他进程向目标进程发送异步通知。 Python 的 signal 模块提供了对这些信号的访问和处理能力&#xff0…...

[LeetCode 189] 轮转数组

[LeetCode 189] 轮转数组 题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 示例 2: 输入&#xff1a;nums [-1,-100,3,99], k 2 …...

【Qt】qDebug() << “中文测试“; 乱码问题

环境 Qt Creator版本&#xff1a;4.7.1 编译器&#xff1a;MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意&#xff1a; 1、需要清理项目&#xff0c;并重新qmake&#xff0c;然后构建。 测试项目下载&#xff1a;https://do…...

解析Java根基:Object类核心方法

Object类常见方法解析 在Java编程中&#xff0c;Object类是所有类的根类&#xff0c;它包含了许多实用的方法&#xff0c;这些方法在不同的场景下发挥着重要作用。下面我们来详细了解一下Object类中的一些常见方法。 1. toString方法 toString方法是用于将对象转换为字符串表…...

最近在工作中感受到了设计模式的重要性

之前了解设计模式&#xff1a;只是应付一下面试 在之前一年多的工作中也没遇到使用场景 最近在搭建验证环境的时候&#xff0c;才发现这玩意这么重要 首先是设计模式的使用场景一定是在很复杂繁琐的场景下进行的 之所以说是复杂/繁琐的场景&#xff0c;因为一些场景也许逻辑不难…...

Docker 镜像、容器与数据卷的高效管理:最佳实践与自动化脚本20250411

Docker 镜像、容器与数据卷的高效管理&#xff1a;最佳实践与自动化脚本 引言 在现代软件开发中&#xff0c;容器化技术正变得越来越重要。Docker 作为容器化的代表工具&#xff0c;在各大企业中得到了广泛的应用。然而&#xff0c;随着容器化应用的增多&#xff0c;如何高效…...

[UEC++]UE5C++各类变量相关知识及其API(更新中)

基础变量 UE自己定义的目的&#xff1a;1.跨平台&#xff1b;2.兼容反射&#xff1b;3.方便宏替换 FString 基础赋值与初始化 遍历与内存 迭代器访问 清除系列操作 合并 插入与移除 RemoveFromStart是从开头看&#xff0c;没有则移除失败返回false&#xff1b; RemoveFromEnd是…...

C++中的设计模式

设计模式是软件工程中用于解决常见问题的可复用解决方案。它们提供了一种标准化的方法来设计和实现软件系统&#xff0c;从而提高代码的可维护性、可扩展性和可重用性。C 是一种支持多种编程范式&#xff08;如面向对象、泛型编程等&#xff09;的语言&#xff0c;因此可以方便…...

Java 设计模式:装饰者模式详解

Java 设计模式&#xff1a;装饰者模式详解 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过动态地为对象添加新功能&#xff0c;扩展其行为&#xff0c;而无需修改原有类的代码。装饰者模式遵循“开闭原则”&#xff0c;提供了比…...

C++ 大数相加(简要版)

#include <algorithm> #include <iterator> class Solution { public:/*** 计算两个数之和* param s string字符串 表示第一个整数* param t string字符串 表示第二个整数* return string字符串*/string solve(string s, string t) {// 处理空字符串的情况&#xf…...

Spring IoC深度解析:掌控Bean存储艺术与分层架构的智慧​​

一、IoC的本质&#xff1a;从"造物主"到"使用者"的思维跃迁 在传统编程中&#xff0c;开发者像"造物主"一样亲手创建每个对象&#xff08;new UserController()&#xff09;&#xff0c;并管理它们的依赖关系。这种方式导致代码高度耦合&#xf…...

8.4 容器2

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 8.4.3 TabControl&#xff08;选项卡&#xff09;控件 TabControl控件可以通过设置多个选项卡页&#xff08;TabPage控件&#xff09…...

一组可能的机器学习问题列表

线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...

Android 权限列表

权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入登记 check-in 数据库属性表的权限android.permission.ACCESS_COARSE_LOCATION获取粗略位置通过 WiFi 或移动基站的方式获取用户粗略的经纬度信息&#xff0c;定位精度大概误差在 30~1500 米an…...

探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法

概述 2019 年&#xff0c;美国众议院议长南希佩洛西成为了一次针对性的、技术含量相对较低的“深度伪造”式攻击的目标。真实的佩洛西视频被编辑&#xff0c;让她看起来像是喝醉了酒。这一不真实的事件在真相大白之前被分享了数百万次&#xff0c;而且在一些人没有关注后续报道…...

调用阿里云API实现身份证文字识别

TOC# 1.作者介绍 姚元帅&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2024级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;3183969029qq.com 乔幸荣&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2024级研究生&a…...

使用UFW+IPSET禁用海外IP配置持久化操作

上一章我们介绍了如何使用ufwipset禁用海外IP&#xff0c;但是如果服务器重启动&#xff0c;之前的配置就无效了&#xff0c;所以让配置持久化可以避免我们反复设置的麻烦。 IPSET配置持久化的方法有很多种&#xff0c;目前我配置成的是设置ipset后台服务&#xff0c;具体方法…...

深入Linux内核理解socket的本质

本文将从一个初学者的角度开始聊起&#xff0c;让大家了解 Socket 是什么以及它的原理和内核实现。 一、Socket 的概念 Socket 就如同我们日常生活中的插头与插座的连接关系。在网络编程中&#xff0c;Socket 是一种实现网络通信的接口或机制。 想象一下&#xff0c;插头插入…...

Python使用爬虫IP抓取数据过程

用户之前询问了不同语言的爬虫示例&#xff0c;特别是Python、Node.js和Ruby。现在他们希望详细扩展Python版本中使用代理IP的过程。 用户可能已经掌握了基本的爬虫编写&#xff0c;但遇到了IP被封的问题&#xff0c;或者想防止被封。他们需要知道如何集成代理IP到现有的代码中…...

通过MCP+数据库实现AI检索和分析

通过 MCP&#xff08;Multi-Agent Collaboration Platform&#xff0c;多智能体协作平台&#xff09; 数据库&#xff0c;实现一个AI检索和分析系统。 一、系统目标 实现通过 AI 多智能体对结构化&#xff08;数据库&#xff09;和非结构化&#xff08;文档、文本&#xff09…...

51单片机烧录程序演示教程

51单片机烧录程序演示教程 51单片机是一种经典的8位单片机&#xff0c;广泛应用于嵌入式系统开发中。烧录程序是指将编译好的代码下载到单片机的存储器中&#xff0c;以便单片机能够按照程序运行。以下是详细的烧录流程和步骤。 所需工具和材料 硬件&#xff1a; 51单片机开发…...

06软件测试需求分析案例-添加用户

给职业顾问部的老师添加用户密码后&#xff0c;他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号&#xff0c;后面招一个教师就添加一个账号。 通读需求是提取信息&#xff0c;提出问题&#xff0c;输出…...

Asp.NET Core WebApi IOptions<T>详解

IOptions<T> 是 ASP.NET Core 中用于访问配置数据的一个接口&#xff0c;它属于 Microsoft.Extensions.Options 命名空间。通过 IOptions<T>&#xff0c;你可以将配置绑定到强类型的类中&#xff0c;并在应用程序的不同部分中注入和使用这些配置。这种方式不仅使得…...

Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商

攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…...

(四十三)Dart 中的空安全与 `required` 关键字

Dart 中的空安全与 required 关键字 空安全&#xff08;Null Safety&#xff09; 空安全&#xff08;Null Safety&#xff09;是 Dart 语言的一项重要特性&#xff0c;旨在帮助开发者避免空指针异常&#xff08;NullPointerException&#xff09;。空安全通过在编译时检查变量…...

《解锁分布式软总线:构建智能设备统一管理平台》

智能设备的数量呈爆发式增长&#xff0c;从智能家居里的各类电器&#xff0c;到智能办公中的电脑、打印机&#xff0c;再到工业领域的各种自动化设备&#xff0c;不一而足。如何对这些纷繁复杂的智能设备进行有效管理&#xff0c;成为摆在我们面前的一道难题。分布式软总线技术…...

【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】

在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中&#xff0c;hci_packets.pdl 是一个 协议描述语言文件&#xff0c;用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析&#xff1a; 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…...

远程升级组件设计

----------------------- | 主应用程序 | ---------------------- | 通信接口&#xff08;使用本地socket通信发送给远程升级模块进程或者线程 | (如何启动进程程execl或execv函数&#xff09;,启动线程用std::sthread。 v ---------------------- 远程升级模块 ----------…...

Kubernetes集群环境搭建与初始化

1.Kubernetes简介&#xff1a; Kubernetes是Google开源的一个容器编排引擎&#xff0c;它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时&#xff0c;通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在Kubernetes中&#xff0c;我…...

Compose 适配 - 响应式排版 自适应布局

一、概念 基于可用空间而非设备类型来设计自适应布局&#xff0c;实现设备无关性和动态适配性&#xff0c;避免硬编码&#xff0c;以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用&#xff0c;APP的显示方式…...

5G_WiFi_CE_DFS

目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择&#xff08;DFS&#xff09;要求 5、产品角色确定测试项目 6、测试项目 测试项1&#xff1a;信道可用性检查&#xff08;Channel Availability Check&#xff09; …...

Lalamove基于Flink实时湖仓演进之路

摘要&#xff1a;本文投稿自货拉拉国际化技术部 资深数据仓库工程师林海亮老师。内容分为以下几个部分&#xff1a; 1、业务简介 2、Flink 在业务中的应用与挑战 3、实时数仓架构的 Flink 驱动演进 4、未来展望 一、业务简介 Lalamove 于2013年在香港成立&#xff0c;是货拉拉的…...

【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现

项目视频介绍&#xff1a; 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介&#xff1a; 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…...

人工智能100问☞第2问:机器学习的核心原理是什么?

目录 一、通俗解释 二、专业解析 三、权威参考 机器学习的核心原理是​​通过数据训练模型,使计算机自动发现数据中的内在规律或模式,并利用这些规律对新数据做出预测或决策​​。这一过程强调数据驱动(从经验中学习)、模型优化(通过损失函数和参数调整提升性能)以及泛…...

【深度学习基础】——机器的神经元:感知机

感知机模型的原理之前已经讲过&#xff08;【感知机模型 - CSDN App】https://blog.csdn.net/2401_88885149/article/details/145563837?sharetypeblog&shareId145563837&sharereferAPP&sharesource2401_88885149&sharefromlink&#xff09;但主要是从数学和机…...

OpenCV 图形API(29)图像滤波-----GMat类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::GMat 是 OpenCV 的 G-API 模块中的一个核心类&#xff0c;用于定义计算图中的数据节点。G-API 是 OpenCV 中的一个模块&#xff0c;旨在通过…...

spark的堆外内存,是在jvm内还是操作系统内存内?

在 Apache Spark 中&#xff0c;堆外内存&#xff08;Off-Heap Memory&#xff09;是直接分配在操作系统的物理内存中&#xff0c;而非 JVM 堆内内存。以下是详细的解释&#xff1a; 1. 堆外内存的本质 操作系统管理 Spark 的堆外内存直接通过操作系统分配&#xff08;例如使用…...

AD9253 LVDS 高速ADC驱动开发

1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下&#xff0c;14bit - 2Lane - 1frame 模式。 对应&#xff1a;data clock时钟为500M DDR mode。data line rate&#xff1a;1Gbps。frame clock&#xff1a;1/4 data clock 具体内容&#xff1a;…...

swift菜鸟教程14(闭包)

一个朴实无华的目录 今日学习内容&#xff1a;1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法&#xff1a;据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写&#xff1a;直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…...

【HarmonyOS NEXT+AI】问答02:有一点编程基础,可以学不?

在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面&#xff0c;有学员问&#xff0c;有一点编程基础&#xff0c;可以学不&#xff1f; 这里统一做下回复。 学习本课程只需要掌握任一编程语言即可&#xff0c;拥有JavaScript、TypeScript、ArkTS或Java语言基础更佳…...

maven 依赖的优先级

最短路径优先 工程中依赖了a、b两个jar包&#xff0c; 在a jar包内引用了b jar包版本为1.0&#xff0c;路径为&#xff1a;Project > a > b(1.0) 工程中直接依赖的b jar包版本为2.0&#xff0c;路径为&#xff1a;Project > b(2.0) 由于b(2.0)路径最短&#xff0…...

Java实现音频录音播放机功能

Java实现一个简单的音频录音和播放功能&#xff0c;使用Swing创建图形用户界面&#xff0c;利用Java Sound API进行音频处理。下面是对此程序的详细剖析&#xff1a; 一、程序结构 程序主要由以下几个部分组成&#xff1a; RecorderFrm类&#xff1a;主框架类&#xff0c;继承自…...

OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像&#xff1a; K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…...

oracle 表空间(Tablespace)

在 Oracle 11g 中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是数据库存储架构的核心逻辑单元&#xff0c;其原理基于 逻辑存储与物理存储的分离&#xff0c;通过分层管理数据文件、段&#xff08;Segment&#xff09;、区&#xff08;Extent&#xff09;和数据块&…...

Git 高级操作

Git不仅是代码管理的基石工具&#xff0c;更是开发者提升效率的瑞士军刀。掌握基础操作只是起点&#xff0c;真正的高手都在使用进阶技巧优化工作流。本文将深入解析Git四大高阶操作&#xff0c;助你轻松应对复杂开发场景&#xff01; 一、交互式暂存&#xff1a;精准控制提交粒…...

Go:程序结构

文章目录 名称声明变量短变量声明指针new 函数变量的生命周期 赋值多重赋值可赋值性 类型声明包和文件导入包初始化 作用域 名称 命名规则&#xff1a; 通用规则&#xff1a;函数、变量、常量、类型、语句标签和包的名称&#xff0c;开头须是字母&#xff08;Unicode 字符 &a…...

sqlserver2017 分离附加数据库

分离数据库 分离数据库是指将数据库从 SQL Server 实例中移除&#xff0c;但会完整保留数据库及其数据文件和事务日志文件。 然后可以使用这些文件将数据库附加到任何 SQL Server 实例&#xff0c;包括分离该数据库的服务器。 如果存在下列任何情况&#xff0c;则不能分离数据…...

QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!

QuarkPi-CA2 RK3588S卡片电脑&#xff1a;6.0Tops NPU8K视频编解码接口丰富&#xff0c;高性能嵌入式开发&#xff01; 芯片框架 视频介绍 https://www.bilibili.com/video/BV1btdbYkEjY 开发板介绍 核心升级&#xff0c;产品炸裂 QuarkPi-CA2卡片电脑搭载瑞芯微RK3588S芯片…...

对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性

一、对称加密与非对称加密的作用 1. 对称加密 作用&#xff1a; 保密性&#xff1a;对称加密使用相同的密钥对数据进行加密和解密&#xff0c;确保数据在传输过程中不被窃听。效率&#xff1a;对称加密算法&#xff08;如AES&#xff09;计算速度快&#xff0c;适合加密大量数…...

Lab Cloud FPGA 硬件在线实验云平台介绍

友晶科技依托其在FPGA技术领域的深厚积累&#xff0c;成功研发出了一套完整的FPGA云平台解决方案&#xff08;即FPGA 硬件在线实验云&#xff0c;简称LabCloud &#xff09;。LabCloud 是一个高效、实用的学习平台&#xff0c;目前已在多个学校成功部署。 LabCloud 是通过 B/S …...