在编写长时间运行的 Python 程序(如服务器、守护进程或数据处理脚本)时,你可能会遇到需要优雅地响应操作系统信号的情况。例如,当用户按下 Ctrl+C 时,程序应安全退出而不是直接崩溃。这就是 Python 信号处理 的用武之地。本文将带你从零开始学习如何使用 Python 内置的 signal 库来处理系统信号,即使是编程小白也能轻松上手。
在 Unix/Linux 和类 Unix 系统中,信号 是一种异步通知机制,用于通知进程发生了某个事件。常见的信号包括:
SIGINT:中断信号,通常由用户按下 Ctrl+C 触发。SIGTERM:终止信号,用于请求程序正常退出。SIGHUP:挂起信号,常用于通知守护进程重新加载配置。SIGKILL:强制终止信号(无法被捕获或忽略)。Python 的 signal 模块提供了对底层操作系统信号的封装。你可以使用它来注册信号处理器(signal handler),即当特定信号到来时要执行的函数。
import signaldef handler(signum, frame): print(f"接收到信号: {signum}")# 注册信号处理器signal.signal(signal.SIGINT, handler) 下面是一个完整的例子,演示如何捕获 SIGINT(即 Ctrl+C)并优雅地关闭程序:
import signalimport timeimport sys# 定义全局标志running = Truedef signal_handler(signum, frame): global running print("\n正在安全退出...") running = False# 注册 SIGINT 信号处理器signal.signal(signal.SIGINT, signal_handler)print("程序启动,按 Ctrl+C 退出")while running: print("程序正在运行...") time.sleep(2)print("程序已退出!")sys.exit(0) 运行这段代码后,当你按下 Ctrl+C,程序不会立即终止,而是打印“正在安全退出...”,然后正常结束。这种做法在开发服务器或后台任务时非常有用。
以下是几个常用的信号及其用途:
| 信号 | 说明 |
|---|---|
| SIGINT (2) | 键盘中断(Ctrl+C) |
| SIGTERM (15) | 请求终止(可被捕获) |
| SIGHUP (1) | 终端挂起或控制进程终止 |
| SIGKILL (9) | 强制终止(不可被捕获或忽略) |
⚠️ 注意事项:
signal 模块仅在 Unix/Linux/macOS 上完全支持;Windows 支持有限(主要支持 SIGINT 和 SIGBREAK)。print() 以外的 I/O 操作(如文件写入),除非你确保线程安全。通过本文,你已经学会了如何使用 Python signal 库 来处理系统信号,实现程序的优雅退出和响应外部事件。无论你是开发 Web 服务、后台脚本还是自动化工具,掌握 Python 中断处理 技巧都能让你的程序更加健壮和专业。记住,良好的 系统信号编程 实践是构建可靠软件的重要一环。
希望这篇 Python信号处理 教程对你有帮助!动手试试吧,你会发现它比想象中更简单。
本文由主机测评网于2025-12-04发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122737.html