Home  >  Article  >  Backend Development  >  Python signal processing signal module

Python signal processing signal module

高洛峰
高洛峰Original
2016-11-22 10:12:591745browse

Introduction to the signal module

Recently I was reading about Linux signal. Signal can be used for inter-process communication and asynchronous processing. The Python standard library provides the signal package that can be used to handle signals. What is discussed here is the signal module of Python in Unix systems.

Simple example of signal

There is such an example in the official documentation:

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)          # 关闭定时器

The function implemented by this example is to prevent an error in opening a file or other exceptions from being in a waiting state, set a timer, and trigger it after 5 seconds IOError. If the file is opened normally within 5 seconds, the timer is cleared.

signal description

Basic signal name

import signal

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

等等...

Commonly used signal processing functions

signal.signal(signalnum, handler)

Set the signal processing function

signal.alarm(time)

Set the SIGALRM signal to be sent Timer

os.kill

This does not belong to the signal module, but it can be used to send a signal to a certain process

signal usage example

Example 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

The above example implements setting the function execution timeout and returning to the default Result function. First, a timeout processing function is set up and a custom exception is thrown in the function. Set signal.alarm before executing the function. When the time is exceeded, the exception SIGALRM is triggered. Then the exception is captured and the default value is set. Finally, the cleanup work is done to cancel the timer and the processing of SIGALRM is set to default.

Example 2

This example comes from here. The requirement is to dynamically load modules imported by python, that is, when the imported module code is updated, it is hoped that the referenced code can be updated immediately. An example is as follows:

# 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()

When scrape.py is run, the program will call the scrape_me_bro() method in lib.py every two seconds. At this time, if the method in lib.py changes, the process of running scrape.py will be called. Send the SIGHUP signal, then it will reload lib.py, which will then loop to execute the modified scrape_me_bro() method.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:Python linecache moduleNext article:Python linecache module