Python 的 signal 模块提供了用于处理 Unix 风格信号的机制,主要用于与操作系统交互,响应如终止、挂起、中断等信号事件。你可以注册自定义的信号处理函数,从而在接收到特定信号时执行自定义代码逻辑。
常见应用场景:
(1)优雅关闭程序(如处理 SIGINT 中断)。
(2)定时器超时控制(如设置请求或函数的超时时间)。
(3)守护进程、子进程通信。
(4)阻塞操作中断。
(5)处理终端退出、挂起、重启等系统信号。
◆ ◆ ◆
核心概念
1、信号(Signal)
由操作系统或用户触发的事件通知,比如按下 Ctrl + C 会产生 SIGINT,进程退出会产生 SIGTERM。
2、处理器(Handler)
通过 signal.signal() 为特定信号注册的回调函数。
3、默认行为
大多数信号默认会终止程序,除非被重定义。
4、信号编号
信号如 SIGINT, SIGTERM 都是常量,对应实际整数编号。
5、不可捕获信号
如 SIGKILL, SIGSTOP 无法被 Python 程序捕获或忽略
◆ ◆ ◆
应用举例
例 1:捕获 Ctrl + C 中断信号(SIGINT)
import signalimport time
def handler(signum, frame): print("接收到 Ctrl+C(SIGINT)信号,准备退出...")
signal.signal(signal.SIGINT, handler)
print("程序运行中,按 Ctrl+C 尝试中断")while True: time.sleep(1)
例 2:设置超时处理机制(定时器 SIGALRM)
import signalimport time
def timeout_handler(signum, frame): raise TimeoutError("操作超时!")
# 注册超时处理器signal.signal(signal.SIGALRM, timeout_handler)signal.alarm(3) # 3 秒后触发 SIGALRM
try: print("开始执行长时间操作...") time.sleep(5)except TimeoutError as e: print("捕获异常:", e)
例 3:优雅关闭子进程或服务(SIGTERM)
import signalimport sys
def terminate_handler(signum, frame): print("接收到 SIGTERM,清理资源后退出") sys.exit(0)
signal.signal(signal.SIGTERM, terminate_handler)
print("运行中,发送 SIGTERM 可终止程序")while True: time.sleep(1)
例 4:忽略某些信号(如 SIGHUP)
import signalimport time
signal.signal(signal.SIGHUP, signal.SIG_IGN) # 忽略挂起信号
print("忽略 SIGHUP 信号,程序不会退出")while True: time.sleep(1)
例 5:注册多个信号响应(SIGINT 和 SIGTERM)
import signalimport time
def handler(signum, frame): print(f"接收到信号:{signum},程序将退出") exit(0)
signal.signal(signal.SIGINT, handler)signal.signal(signal.SIGTERM, handler)
print("等待信号(Ctrl+C 或 kill)...")while True: time.sleep(1)
◆ ◆ ◆
常用函数速览
signal.alarm(seconds)
设置信号定时器,在指定秒数后触发 SIGALRM。
参数:
seconds:延迟秒数,0 表示取消定时器
返回:前一个定时器剩余秒数(若有)
signal.getsignal(signalnum)
获取当前某个信号的处理器。
参数:
signalnum:信号编号(如 signal.SIGINT)
返回:当前注册的处理函数
signal.pause()
阻塞程序直到接收到信号。
参数:无
返回:被信号中断时继续执行
signal.setitimer(which, seconds, interval=0)
设置信号定时器(更高精度),代替 alarm()。
参数:
which:如 signal.ITIMER_REAL(实时时间,发出 SIGALRM)
seconds:首次触发延迟
interval:之后每次的间隔(0 表示只触发一次)
返回:前一个定时器的剩余时间(元组)
signal.signal(signalnum, handler)
为指定信号注册处理函数。
参数:
signalnum:信号编号(如 signal.SIGTERM)
handler:处理函数,或特殊值如 signal.SIG_IGN(忽略)或 signal.SIG_DFL(默认行为)
返回:之前的处理器
◆ ◆ ◆
补充说明
1、仅主线程可设置信号处理器。注册处理器(signal.signal())必须在主线程中进行。
2、Windows 支持有限。仅支持 SIGINT, SIGBREAK, SIGABRT,不支持 SIGALRM, SIGTERM 等 Unix 信号。
3、常用信号说明:
SIGINT:中断(Ctrl + C)
SIGTERM:终止请求(如 kill)
SIGALRM:超时(定时器)
SIGKILL / SIGSTOP:不可捕获
“点赞有美意,赞赏是鼓励”