在Python中,信号是操作系统与进程间通信的机制,用于通知进程异步事件。信号由内核或进程触发,进程可通过注册处理函数自定义响应行为。常见信号包括SIGINT、SIGTERM和SIGALRM。Python通过signal模块处理信号,支持捕获、忽略或恢复默认行为,但需注意线程安全和平台差异。
一、python中信号Signal是什么?
在Python中,信号是操作系统与进程间通信的机制,用于通知进程异步事件。信号由内核或进程触发,进程可通过信号处理函数自定义响应行为。
SIGINT(键盘中断,如Ctrl+C)
SIGTERM(终止请求)
SIGALRM(定时器超时)
二、如何在Python中处理信号?
Python通过signal模块处理信号,基本步骤如下:
(1)导入模块
python1import signal
(2)定义信号处理函数
处理函数需接受两个参数:信号编号(signum)和当前栈帧(frame)。
python1def handler(signum, frame):
2 print(f"收到信号: {signum}")
3 # 可在此执行清理操作或退出程序
(3)注册信号与处理函数
使用signal.signal()绑定信号与处理函数:
python1signal.signal(signal.SIGINT, handler) # 处理Ctrl+C
2signal.signal(signal.SIGTERM, handler) # 处理终止请求
(4)触发信号(可选)
通过os.kill()或键盘输入触发信号测试:
python1import os
2os.kill(os.getpid(), signal.SIGINT) # 向当前进程发送SIGINT

三、信号处理函数的实现方式
(1)同步处理
直接在处理函数中执行逻辑:
python1def sync_handler(signum, frame):
2 print("执行清理操作...")
3 exit(0)
(2)异步处理
在异步框架(如asyncio)中,可通过标志位通知主循环:
python1import asyncio
2
3shutdown_flag = False
4
5def async_handler(signum, frame):
6 global shutdown_flag
7 shutdown_flag = True
8
9signal.signal(signal.SIGINT, async_handler)
10
11async def main():
12 while not shutdown_flag:
13 await asyncio.sleep(1)
14 print("安全退出")
15
16asyncio.run(main())
(3)忽略信号
将处理函数设为signal.SIG_IGN可忽略信号:
python1signal.signal(signal.SIGINT, signal.SIG_IGN) # 忽略Ctrl+C
(4)恢复默认行为
使用signal.SIG_DFL恢复系统默认处理:
python1signal.signal(signal.SIGTERM, signal.SIG_DFL) # 终止进程
四、python中信号Signal注意事项
线程安全:信号处理函数中避免调用非线程安全操作。
限制:某些信号不可捕获或忽略。
平台差异:Windows对信号支持有限。
完整示例
python1import signal
2import time
3
4def handler(signum, frame):
5 print(f"\n捕获信号 {signum},执行清理...")
6 exit(0)
7
8signal.signal(signal.SIGINT, handler)
9signal.signal(signal.SIGTERM, handler)
10
11print("程序运行中,按Ctrl+C终止...")
12while True:
13 time.sleep(1)
运行后按Ctrl+C会触发自定义处理逻辑,安全退出程序。
在Python中,signal是用于处理Unix信号的模块,允许用户注册自定义的信号处理函数,当进程接收到操作系统发送的特定信号时执行相应操作。多线程程序中需确保信号处理逻辑本身是线程安全的。