zoukankan      html  css  js  c++  java
  • Python学习笔记14:标准库之信号量(signal包)

    signal包负责在Python程序内部处理信号。典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。
    要注意,signal包主要是针对UNIX平台(比方Linux, MAC OS)。而Windows内核中因为对信号机制的支持不充分,
    所以在Windows上的Python不能发挥信号系统的功能。

    定义信号名

    signal包定义了各个信号名及其相应的整数。比方
    import signal
    print signal.SIGALRM
    print signal.SIGCONT

    Python所用的信号名和Linux一致。

    能够通过
    $man 7 signal
    查询


    预设信号处理函数

    signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,例如以下所看到的:

    singnal.signal(signalnum, handler)

    signalnum为某个信号。handler为该信号的处理函数。


    我们在信号基础里提到。进程能够无视信号,能够採取默认操作,还能够自己定义操作。
    当handler为signal.SIG_IGN时,信号被无视(ignore)。
    当handler为singal.SIG_DFL,进程採取默认操作(default)。
    当handler为一个函数名时。进程採取函数中定义的操作。


    import signal
    # Define signal handler function
    def myHandler(signum, frame):
        print("I recerive signal:", signum)
    
    
    # Register signal.SIGTSTP's handler
    signal.signal(signal.SIGTSTP, myHandler)
    siganl.pause()
    print("End")

    在主程序中。首先使用signal.signal()函数来预设信号处理函数。


    然后我们运行signal.pause()来让该进程暂停以等待信号。以等待信号。
    当信号SIGUSR1被传递给该进程时,进程从暂停中恢复。并依据预设,运行SIGTSTP的信号处理函数myHandler()。
    myHandler的两个參数一个用来识别信号(signum)。还有一个用来获得信号发生时,进程栈的状况(stack frame)。


    这两个參数都是由signal.singnal()函数来传递的。




    上面的程序能够保存在一个文件里(比方test.py)。

    我们使用例如以下方法执行:
    $python test.py
    以便让进程执行。

    当程序执行到signal.pause()的时候,进程暂停并等待信号。
    此时,通过按下CTRL+Z向该进程发送SIGTSTP信号。
    能够看到。进程运行了myHandle()函数, 随后返回主程序。继续运行。
    当然,也能够用$ps查询process ID, 再使用$kill来发出信号。


    进程并不一定要使用signal.pause()暂停以等待信号,它也能够在进行工作中接受信号。
    比方将上面的signal.pause()改为一个须要长时间工作的循环。


    能够依据自己的须要更改myHandler()中的操作。以针对不同的信号实现个性化的处理。



    import signal
    # Define signal handler function
    def myHandler(signum, frame):
        print("Now,it's time")
    
    # Register signal.SIGTSTP's handler
    signal.signal(signal.SIGALRM, myHandler)
    signal,alarm(5)
    while True:
        print("End")

    这里用了一个无限循环以便让进程持续执行。
    在signal.alarm()运行5秒之后,进程将向自己发出SIGALRM信号。随后。信号处理函数myHandler開始运行。


    发送信号

    signal包的核心是设置信号处理函数。


    除了signal.alarm()向自身发送信号之外。并没有其它发送信号的功能。


    但在os包中。有类似于linux的kill命令的函数。分别为
    os.kill(pid, sid)
    os.killpg(pgid, sid)
    分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所相应的整数或者singal.SIG*。
    实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数。在这里,我们仅仅只是是用Python语言来实现了一下。
    实际上,Python 的解释器是使用C语言来编写的。所以有此相似性也并不意外。
    此外,在Python 3.4中,signal包被增强,信号堵塞等功能被增加到该包中。

  • 相关阅读:
    Android开发总结
    LeakCanary原理分析
    机器学习
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):2. 实现绘图功能
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作
    远程显示(操作) 服务器 GUI 程序(图形化界面) (基于 X11 Forwarding + Centos + MobaXterm)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6852707.html
Copyright © 2011-2022 走看看