python之signal操作
1 信号的意义
在linux系统中信号是与进程通信的一种手段。假设没有信号,linux中的进程一旦运行起来将不再受控,这种局面对于进程的管理来说是一种灾难。kill、ctrl+c等操作本质上就是我们向linux发出的信号,进程接收到信号后根据相应的策略做出反馈。
2 信号的来源
A) 通过终端(组合键)产生信号
最典型的ctrl+c终止当前进程
B) 硬件异常产生信号
例如进程运行中内存的寻址出现异常,就会发出信号。
C) 显式的调用linux命令产生信号
最典型的kill命令,通过linux命令发出信号干预进程运行
D) 软件代码发送信号
Java本地方法、Python signal类包等,通过程序发出信号。
3 有哪些信号
执行命令$kill -l可以看到信号列表
可以看到有62种信号,32、33轮空;1-31号为不可靠信号,是linux自带的与进程通信的信号;34-64是可靠信号,是为了弥补linux不可靠信号太少而扩展的。不可靠信号多次发出最终只响应1次;而可靠信号每次都有响应。
执行命令$man 7 signal可以更详细的查看每一种信号的意义:
例如我们前面说过的ctrl+c,对应的是2号sigint;kill对应的是9号sigkill;内存错误对应的11号sigsegv。
4 进程会如何处理这些信号
并不是每种信号进程都要给出反馈的,进程对待信号会有3种策略:
A) 忽略此信号
好理解,就是假装没看见,不鸟它。
B) 执行默认动作
例如终止进程等
C) 提供一个信号处理函数,要求内核执行该函数
通过某种形式在发送信号时同时给定处理信号的函数,相当于回调函数
5 python对信号的支持
Python对信号的操作在importsignal这个包里,有了前面知识的积累,我们很好理解signal包调用的侧重点:哪种信号?如何处理?如何发送?
A) 哪种信号?
Linux的62种信号,signal包已经都搬到python中来了,需要开发人员自己选择一种
B) 如何处理?
Signal默认提供了Ignal和Default2种策略,同时支持开发人员自定义回调函数
C) 如何发送?
Signal对信号的发送做了简易的封装,例如alarm()函数发起sigalrm信号
6 案例,做一个timeout的自定义annotation:
import signaldef timeout(seconds=10, error_message="connect to server timeout"):def decorator(func):def _handle_timeout(signum, frame):raise TimeoutError(error_message)def wrapper(*args, **kwargs):signal.signal(signal.SIGALRM, _handle_timeout)signal.alarm(seconds)try:result = func(*args, **kwargs)finally:signal.alarm(0)return resultreturn wraps(func)(wrapper)return decorator
先定制了一个回调函数decorator,超时后直接抛异常;
然后通过signal.signal()方法决定了信号种类和处理方式,第一个参数可以替换成62种信号的其中一种,第二个参数还可以传入SIG_DFL或SIG_IGN;
最后通过signal.alarm()函数发起信号。
这样我就自己开发了一个超时处理机制。
@timeout(1200)
def ready_host(**not_connected):while True:if not any(not_connected):breakfor h in not_connected.keys():if check_port_is_open(h):del not_connected[h]return True
这是个批量验证网络连接的函数,not_connected是个集合存放着需要做尝试的所有远程机器,我通过@timeout(1200)的方式设定等待20分钟后如果测试还没有全部通过就抛出异常。
python之signal操作相关推荐
- Python语音基础操作--4.3共振峰估计
<语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...
- 浅析Python中signal包的使用
原文链接:https://www.jb51.net/article/74844.htm 这篇文章主要介绍了Python中signal包的使用,主要在Linux系统下对进程信号进行相关操作,需要的朋友可 ...
- python(10): Signal
信号Signal 信号Signal的全称为软中断信号,是用来通知进程发生了异步事件,是在软件层次上对中断机制的一种模拟.原理上一个进程收到一个信号与CPU收到一个中断请求可以说是类似的. 信号是进程间 ...
- python subprocess相关操作
python subprocess常用操作 1.subprocess模块的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返 ...
- Python语音基础操作--5.1自适应滤波
<语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...
- Python语音基础操作--10.1基于动态时间规整(DTW)的孤立字语音识别试验
<语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...
- Python语音基础操作--3.5线性预测分析
<语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...
- python模块—signal
文章目录 信号 介绍 生命周期 信号处理 信号表示 信号分类 信号通信 常用信号 python signal 信号 介绍 信号signal的全称是软中断信号,是用来通知进程发生的异步事件,是在软件层次 ...
- Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8
我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...
最新文章
- android固定位置滚动文本,android – 滚动文本上方的按钮,按钮固定在底部
- R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(自定义边界调色板、brewer调色板、比例灰度)实战
- android教程 - android ui 介绍,多图详解 “Android UI”设计官方教程
- CMS sell in customizing
- 看新闻的时间用的太多了
- ajax后台重定向会返回什么_跳转,AJAX返回和重定向
- Flash小玩意图案创作:新增MulCircle和圆环
- 【Level 08】U08 Positive Attitude L5 Satisfy your need to know
- 服务端_多面手之服务端测试
- docker客户端和服务端
- 有赞 WEB-UI 自动化实践
- 移动端UI设计尺寸适配
- 下载百度排行榜音乐的程序(Perl)
- Jenkins基础: root URL设定
- matlab如何拼接矩阵
- 网传鸿蒙系统测试版pS,鸿蒙系统测试版3.0-鸿蒙系统app测试版3.0安卓v3.0下载-pszxw下载站...
- Xpath语法之谓语小记
- 深入浅出HTTP协议
- html5实现图片预览和查看原图
- QT APP实战-图片播放器