网络编程:异步进程间通信---标准库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)

 

posted @ 2021-01-08 13:49  昱成  阅读(175)  评论(0编辑  收藏  举报