在Python中,信號是操作系統(tǒng)與進程間通信的機制,用于通知進程異步事件。信號由內(nèi)核或進程觸發(fā),進程可通過注冊處理函數(shù)自定義響應行為。常見信號包括SIGINT、SIGTERM和SIGALRM。Python通過signal模塊處理信號,支持捕獲、忽略或恢復默認行為,但需注意線程安全和平臺差異。
一、python中信號Signal是什么?
在Python中,信號是操作系統(tǒng)與進程間通信的機制,用于通知進程異步事件。信號由內(nèi)核或進程觸發(fā),進程可通過信號處理函數(shù)自定義響應行為。
SIGINT(鍵盤中斷,如Ctrl+C)
SIGTERM(終止請求)
SIGALRM(定時器超時)
二、如何在Python中處理信號?
Python通過signal模塊處理信號,基本步驟如下:
(1)導入模塊
python1import signal
(2)定義信號處理函數(shù)
處理函數(shù)需接受兩個參數(shù):信號編號(signum)和當前棧幀(frame)。
python1def handler(signum, frame):
2 print(f"收到信號: {signum}")
3 # 可在此執(zhí)行清理操作或退出程序
(3)注冊信號與處理函數(shù)
使用signal.signal()綁定信號與處理函數(shù):
python1signal.signal(signal.SIGINT, handler) # 處理Ctrl+C
2signal.signal(signal.SIGTERM, handler) # 處理終止請求
(4)觸發(fā)信號(可選)
通過os.kill()或鍵盤輸入觸發(fā)信號測試:
python1import os
2os.kill(os.getpid(), signal.SIGINT) # 向當前進程發(fā)送SIGINT

三、信號處理函數(shù)的實現(xiàn)方式
(1)同步處理
直接在處理函數(shù)中執(zhí)行邏輯:
python1def sync_handler(signum, frame):
2 print("執(zhí)行清理操作...")
3 exit(0)
(2)異步處理
在異步框架(如asyncio)中,可通過標志位通知主循環(huán):
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)忽略信號
將處理函數(shù)設為signal.SIG_IGN可忽略信號:
python1signal.signal(signal.SIGINT, signal.SIG_IGN) # 忽略Ctrl+C
(4)恢復默認行為
使用signal.SIG_DFL恢復系統(tǒng)默認處理:
python1signal.signal(signal.SIGTERM, signal.SIG_DFL) # 終止進程
四、python中信號Signal注意事項
線程安全:信號處理函數(shù)中避免調(diào)用非線程安全操作。
限制:某些信號不可捕獲或忽略。
平臺差異:Windows對信號支持有限。
完整示例
python1import signal
2import time
3
4def handler(signum, frame):
5 print(f"\n捕獲信號 {signum},執(zhí)行清理...")
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會觸發(fā)自定義處理邏輯,安全退出程序。
在Python中,signal是用于處理Unix信號的模塊,允許用戶注冊自定義的信號處理函數(shù),當進程接收到操作系統(tǒng)發(fā)送的特定信號時執(zhí)行相應操作。多線程程序中需確保信號處理邏輯本身是線程安全的。