網路程式設計:非同步程序間通訊---標準庫signal模組
https://docs.python.org/zh-cn/3/library/signal.html#module-signal
signal
--- 設定非同步事件處理程式
1、訊號
【1】 一個程序向另外一個程序通過訊號的方式傳遞某種訊息。
【2】接收方在接收到訊號後作出相應的處理。
2、訊號名稱
系統定義,名字或者數字
3、訊號含義
系統定義,訊號的作用
e.g: kill -l
SIGHUP 斷開連線
SIGINT ctrl-c
SIGQUIT ctrl-\
SIGTSTP ctrl-z
SIGKILL 終止程序且不能被處理
SIGSTOP 暫停程序且不能被處理
SIGALRM 時鐘訊號
SIGCHLD 子程序狀態改變傳送給父程序資訊號
4、訊號預設處理方法
當一個程序接收到訊號時,預設產生的效果。(終止程序、暫停程序、忽略發生)
python訊號處理
程式的同步執行和非同步執行
【1】同步 : 程式按照步驟一步一步執行,呈現一個先後性和順序性
【2】非同步 : 程式在執行中利用核心功能幫助完成必要的輔助操作,不影響應用層持續執行
1、os.kill(pid,sig)
功能 : 傳送一個訊號給某個程序
引數 : pid, 給哪個程序傳送訊號
sig,具體要傳送的訊號
2、signal.alarm(sec)
功能: 設定時鐘訊號, 在一定時間後給自身傳送SIGALRM訊號
引數: sec 時間(秒)
① 一個程序中只能有一個時鐘,後來的時候會覆蓋前面的時間
② windows上signal模組沒有此方法
3、signal.pause()
功能: 阻塞程序,等待一個訊號
4、signal.signal(sig,handler)
功能 : 處理訊號
引數 : sig, 要處理的訊號
handler, 訊號處理方法
可選值 : SIG_DFL, 表示使用預設方法處理
SIG_IGN, 表示忽略這個訊號
func ,自定義函式
自定義函式格式 :
def func(sig,frame)
sig , 接收到的訊號
frame,訊號結構物件
【1】signal函式也是一個非同步處理函式。只要執行了該函式,則程序任意時候接收到相應訊號都會處理。
【2】signal 是不能處理 SIGKILL SIGSTOP的
【3】父程序中可以用 signal(SIGCHLD,SIG_IGN)將子程序的退出交給系統處理
【4】訊號是一種非同步的程序間通訊方法
import signal
from time import sleep
signal.alarm(5)
#使用預設的方法處理訊號
# signal.signal(signal.SIGALRM,signal.SIG_DFL)
#使用忽略訊號的方法處理
signal.signal(signal.SIGALRM,signal.SIG_IGN)
signal.signal(signal.SIGINT,signal.SIG_IGN)
while True:
sleep(2)
print("摁ctrl-c")
print("等待時鐘....")
from signal import *
import time
def handler(sig,frame):
if sig == SIGALRM:
print("收到時鐘訊號")
elif sig == SIGINT:
print("就不結束")
alarm(5)
signal(SIGALRM,handler)
signal(SIGINT,handler)
while True:
print("Waiting for a signal")
time.sleep(2)