Python学习笔记14:标准库之信号量(signal包)
signal包负责在Python程序内部处理信号。典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。
要注意,signal包主要是针对UNIX平台(比方Linux, MAC OS)。而Windows内核中因为对信号机制的支持不充分,
所以在Windows上的Python不能发挥信号系统的功能。
定义信号名
signal包定义了各个信号名及其相应的整数。比方
import signal
print signal.SIGALRM
print signal.SIGCONT
Python所用的信号名和Linux一致。
能够通过
$man 7 signal
查询
预设信号处理函数
signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,例如以下所看到的:
singnal.signal(signalnum, handler)
signalnum为某个信号。handler为该信号的处理函数。
我们在信号基础里提到。进程能够无视信号,能够採取默认操作,还能够自己定义操作。
当handler为signal.SIG_IGN时,信号被无视(ignore)。
当handler为singal.SIG_DFL,进程採取默认操作(default)。
当handler为一个函数名时。进程採取函数中定义的操作。
import signal
# Define signal handler function
def myHandler(signum, frame):
print("I recerive signal:", signum) # Register signal.SIGTSTP's handler
signal.signal(signal.SIGTSTP, myHandler)
siganl.pause()
print("End")
在主程序中。首先使用signal.signal()函数来预设信号处理函数。
然后我们运行signal.pause()来让该进程暂停以等待信号。以等待信号。
当信号SIGUSR1被传递给该进程时,进程从暂停中恢复。并依据预设,运行SIGTSTP的信号处理函数myHandler()。
myHandler的两个參数一个用来识别信号(signum)。还有一个用来获得信号发生时,进程栈的状况(stack frame)。
这两个參数都是由signal.singnal()函数来传递的。
上面的程序能够保存在一个文件里(比方test.py)。
我们使用例如以下方法执行:
$python test.py
以便让进程执行。
当程序执行到signal.pause()的时候,进程暂停并等待信号。
此时,通过按下CTRL+Z向该进程发送SIGTSTP信号。
能够看到。进程运行了myHandle()函数, 随后返回主程序。继续运行。
当然,也能够用$ps查询process ID, 再使用$kill来发出信号。
进程并不一定要使用signal.pause()暂停以等待信号,它也能够在进行工作中接受信号。
比方将上面的signal.pause()改为一个须要长时间工作的循环。
能够依据自己的须要更改myHandler()中的操作。以针对不同的信号实现个性化的处理。
import signal
# Define signal handler function
def myHandler(signum, frame):
print("Now,it's time") # Register signal.SIGTSTP's handler
signal.signal(signal.SIGALRM, myHandler)
signal,alarm(5)
while True:
print("End")
这里用了一个无限循环以便让进程持续执行。
在signal.alarm()运行5秒之后,进程将向自己发出SIGALRM信号。随后。信号处理函数myHandler開始运行。
发送信号
signal包的核心是设置信号处理函数。
除了signal.alarm()向自身发送信号之外。并没有其它发送信号的功能。
但在os包中。有类似于linux的kill命令的函数。分别为
os.kill(pid, sid)
os.killpg(pgid, sid)
分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所相应的整数或者singal.SIG*。
实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数。在这里,我们仅仅只是是用Python语言来实现了一下。
实际上,Python 的解释器是使用C语言来编写的。所以有此相似性也并不意外。
此外,在Python 3.4中,signal包被增强,信号堵塞等功能被增加到该包中。
Python学习笔记14:标准库之信号量(signal包)的更多相关文章
- Python标准库07 信号 (signal包,部分os包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...
- C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型
一.string #include <string> using std::string 初始化函数: string s1; 默认构造函数 s1 为空串 ...
- C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型
标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...
- python学习23之标准库
'''''''''标准库1.datetime 日期时间模块存在于Lib/datetime.py文件内'''from datetime import datetime,date,time #from d ...
- Python 3 学习笔记之——标准库概述
1. 操作系统接口 os 模块提供了一些与操作系统相关联的函数. >>> os.getcwd() # 获取当前工作目录 '/home/senius' >>> os. ...
- 吴裕雄--天生自然python学习笔记:beautifulsoup库的使用
Beautiful Soup 库简介 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简 ...
- Python学习笔记之——requests库
requests库一个优雅而简单的用于Python的HTTP库,可以极大的简化我们发送http请求及获取响应的代码. requests是python的第三方库,所以使用之前需要先安装. 1.安装之后就 ...
- python学习笔记(自定义库文件路径)
博主最近在弄接口自动化.主要是基于python自带的unittest框架.包括 Pubilc模块定义所有接口. Main模块根据业务需求重新封装接口便于测试. config文件导入测试业务的固定参数. ...
- 【Python学习笔记】Pandas库之DataFrame
1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matla ...
随机推荐
- foj 2144 三位几何+区间覆盖
题目大意:一个人站在三维坐标系下的原点处用炮打蚊子,给出n个蚊子的起始坐标跟单位时间匀速移动的方向向量,距离他R以内的蚊子都可以打到,不过他也需要休息,没蚊子的时候也可以休息下.求他要起来多少次打蚊子 ...
- 博彩游戏(tyvj 1519)
背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否 ...
- codeforces 900D 数论+组合+容斥原理
问有多少个这样的数字序列 所有数的GCD等于x 并且 所有数的和等于y 题解: 非常难有思路啊 看题解后过的. 考虑序列GCD为x的倍数 即GCD = n*x 和当然都为y 这个条件不要忘了 这样我们 ...
- C语言的二次实验报告
题目一 题目二 题目三 题目四 题目五 部分源代码 11-1求矩阵的局部极大值 #include<stdio.h>int main(){ int m,n,i=0,j=0,count= ...
- 转 Kafka入门经典教程
Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...
- python--导入就方便实现你需要的功能(模块)
模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了 ...
- PV、PVC、StorageClass讲解
PV.PVC.StorageClass讲解 为了方便开发人员更加容易的使用存储才出现的概念.通常我们在一个POD中定义使用存储是这样的方式,我们以hostpath类型来说: apiVersion: v ...
- 从源码解析 Spring JDBC 异常抽象
初入学习 JDBC 操作数据库,想必大家都写过下面的代码: 数据库为:H2 如果需要处理特定 SQL 异常,比如 SQL 语句错误,这个时候我们应该怎么办? 查看 SQLException 源码,我们 ...
- BZOJ1013球形空间产生器sphere 高斯消元
@[高斯消元] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球 ...
- mybatis学习网站
http://www.mybatis.org/mybatis-3/zh/index.html