资讯专栏INFORMATION COLUMN

Python 信号处理 signal 模块

rainyang / 1055人阅读

摘要:如果内正常打开文件,则清除定时器。在执行函数前设置了,当超出时间后触发抛出异常然后捕获这个异常设置默认值,最后做下清理工作将定时器取消,并且将对的处理设为默认。

signal模块简介

最近在看Linux signal 相关内容,signal可以被用来进程间通信和异步处理。Python标准库提供了signal包可以用来处理信号相关。这里讨论的是Unix系统中Python的signal模块。

signal简单示例

官方文档上有这样的示例:

import signal, os

# 定义一个信号处理函数,该函数打印收到的信号,然后raise IOError
def handler(signum, frame):
    print "Signal handler called with signal", signum
    raise IOError("Couldn"t open device!")

# 对SIGALRM(终止)设置处理的handler, 然后设置定时器,5秒后触发SIGALRM信号
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This open() may hang indefinitely
fd = os.open("/dev/ttyS0", os.O_RDWR)

signal.alarm(0)          # 关闭定时器

该示例实现的功能是,为了防止打开一个文件出错或者其他异常一直处于等待的状态,设定一个定时器,5秒后触发IOError。如果5s内正常打开文件,则清除定时器。

signal说明 基本的信号名
import signal

signal.SIGABORT
signal.SIGHUP  # 连接挂断
signal.SIGILL  # 非法指令
signal.SIGINT  # 连接中断
signal.SIGKILL # 终止进程(此信号不能被捕获或忽略)
signal.SIGQUIT # 终端退出
signal.SIGTERM # 终止
signal.SIGALRM  # 超时警告
signal.SIGCONT  # 继续执行暂停进程

等等...
常用信号处理函数

signal.signal(signalnum, handler)

设置信号处理的函数

signal.alarm(time)

设置发送SIGALRM信号的定时器

os.kill

这个不属于signal模块,但其可以使用给某一进程发送信号

signal使用示例 示例1
# From project httpscreenshot-master, under directory , in source file httpscreenshot.py.
def timeoutFn(func, args=(), kwargs={}, timeout_duration=1, default=None):
    import signal

    class TimeoutError(Exception):
        pass

    def handler(signum, frame):
        raise TimeoutError()

    # set the timeout handler
    signal.signal(signal.SIGALRM, handler)
    signal.alarm(timeout_duration)
    try:
        result = func(*args, **kwargs)
    except TimeoutError as exc:
        result = default
    finally:
        signal.alarm(0)
        signal.signal(signal.SIGALRM, signal.SIG_DFL)

    return result

上面这个示例实现了设置函数执行超时返回默认结果的功能。先是设置了一个超时处理函数,在函数中抛出自定义的抛出异常。在执行函数前设置了 signal.alarm ,当超出时间后触发抛出异常 SIGALRM, 然后捕获这个异常设置默认值,最后做下清理工作将定时器取消,并且将对 SIGALRM 的处理设为默认。

示例2

这个示例来源于这里。 需求是动态加载python导入的模块,也就是说,当导入的模块代码更新时,希望可以立即更新引用的代码。示例如下:

# lib.py
def scrape_me_bro():
        print "Scraping is fun"



#scrape.py
import time
import signal
import lib

def scrape():
        # Assume we are hitting Streaming API
        # and doing something buzzwordy with it
        while True:
                lib.scrape_me_bro()
                time.sleep(2)

def reload_libs(signum, frame):
        print "Received Signal: %s at frame: %s" % (signum, frame)
        print "Excuting a Lib Reload"
        reload(lib)

# Register reload_libs to be called on restart
signal.signal(signal.SIGHUP, reload_libs)

# Main
scrape()

当运行scrape.py时,程序会每个两秒调用一次lib.py中的 scrape_me_bro() 方法,这时候如果lib.py里的方法变化了,向运行scrape.py的进程发送 SIGHUP 信号,那么它会重新加载lib.py,这样会接着循环执行修改后的 scrape_me_bro() 方法。

参考资料

《Beginning Linux Programming》

https://docs.python.org/2/lib...

http://engineerwithoutacause....

http://www.cnblogs.com/vamei/...

http://www.programcreek.com/p...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44264.html

相关文章

  • 一个 Reentrant Error 引发的对 Python 信号机制的探索和思考

    摘要:倘若该回答是正确的,则立即有如下推论在处理信号的过程中,字节码具有原子性。因此,除了在两个字节码之间,应该还有其他时机唤起了。行的是信号处理函数的最外层包装,由系统调用或注册至内核,并在信号发生时被内核回调,是异常控制流的入口。 写在前面 前几天工作时遇到了一个匪夷所思的问题。经过几次尝试后问题得以解决,但问题产生的原因却仍令人费解。查找 SO 无果,我决定翻看 Python 的源码。...

    shiguibiao 评论0 收藏0
  • Python 调试方法

    摘要:背景这几天一直在查一个线上程序住的问题这个程序总是在运行分钟后住通过以下的一些调试手段发现是打日志的时候因为满被了日志是默认打到的无论日志级别而我这个程序是被另一个程序调起的父进程没有接收子进程的导致了被打满在调试的过程中用到了以下几种调试 FROM http://kamushin.github.io/debug/python.html 背景 这几天一直在查一个线上程序 hang 住的...

    klivitamJ 评论0 收藏0
  • python模块之subprocess类与常量

    摘要:限于,可选的文件描述符序列,用于在父子进程间保持开放。如果设置了,表示派生的进程号子进程返回码,表示进程未终止。如果未捕获标准错误返回方法如果非,抛出异常异常模块的异常基类子进程执行超时。 常量 subprocess.DEVNULL:可传递给stdin, stdout, stderr参数的特殊值,意味着将使用特殊文件os.devnull重定向输入输出 subprocess.PIPE:可...

    Alan 评论0 收藏0
  • 事件和信号——pyQT5

    摘要:事件目标是事件想作用的目标。处理事件方面有个机制。这个例子中,我们替换了事件处理器函数。代表了事件对象。程序展示信号发送实例能发送事件信号。我们创建了一个叫的信号,这个信号会在鼠标按下的时候触发,事件与绑定。 事件和信号 事件 signals and slots 被其他人翻译成信号和槽机制,(⊙o⊙)…我这里还是不翻译好了。 所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,...

    张春雷 评论0 收藏0
  • tornado 源码阅读-初步认识

    摘要:序言最近闲暇无事阅读了一下的源码对整体的结构有了初步认识与大家分享不知道为什么右边的目录一直出不来非常不舒服不如移步到吧是的核心模块也是个调度模块各种异步事件都是由他调度的所以必须弄清他的执行逻辑源码分析而的核心部分则是这个循环内部的逻辑贴 序言 最近闲暇无事,阅读了一下tornado的源码,对整体的结构有了初步认识,与大家分享 不知道为什么右边的目录一直出不来,非常不舒服. 不如移...

    2450184176 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<