1. 程式人生 > 實用技巧 >網路程式設計:非同步程序間通訊---標準庫signal模組

網路程式設計:非同步程序間通訊---標準庫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)