第十章:使用进程、线程和协程提供并发性-signal:异步系统事件-接收信号

10.2 signal:异步系统事件
信号是一个操作系统特性,它提供了一个途径可以通知程序这里发生了一个事件,并且异步处理这个事件。信号可以由系统本身生成,也可以从一个进程发送到另一个进程。由于信号会中断程序的正常控制流,如果在操作过程中间接收到信号,有些操作(特别是I/O操作)则可能会产生错误。
信号由整数标识,在操作系统C首部中定义。Python在signal模块中提供了适合不同平台的多种信号(作为符号)。这一节中的例子使用了SIGINT和SIGUSR1,通常会为所有UNIX和类UNIX系统定义这两个信号。

10.2.1 接收信号
与其他形式基于事件的编程一样,要建立一个回调函数来接收信号,这个回调函数被称为信号处理器(signal handler),它会在出现信号时调用。信号处理器的参数包括信号编号以及程序被信号中断那一时刻的栈帧。

import signal
import os
import time

def receive_signal(signum,stack):
    print('Received:',signum)

# Register signal handlers.
signal.signal(signal.SIGUSR1,receive_signal)
signal.signal(signal.SIGUSR2,receive_signal)

# Print the process IO so it can be used with 'kill'
# to send this program signals.
print('My PID is:',os.getpid())

while True:
    print('Waiting...')
    time.sleep(3)

这个示例脚本会无限循环,每次暂停几秒。一个信号到来时,sleep()调用被中断,并且信号处理器receive_signal()打印信号编号。信号处理器返回时,循环继续。可以使用os.kill()或UNIX命令行程序kill向正在运行的程序发送信号。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/89499181