>  기사  >  백엔드 개발  >  Python 신호 처리 신호 모듈

Python 신호 처리 신호 모듈

高洛峰
高洛峰원래의
2016-11-22 10:12:591749검색

시그널 모듈 소개

최근에 리눅스 시그널 관련 내용을 읽었는데, 시그널은 프로세스 간 통신과 비동기 처리에 사용될 수 있습니다. Python 표준 라이브러리는 신호를 처리하는 데 사용할 수 있는 신호 패키지를 제공합니다. 여기서 논의되는 것은 Unix 시스템에서 Python의 신호 모듈입니다.

신호의 간단한 예

공식 문서에는 다음 예가 있습니다.

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를 발생시킵니다. 5초 이내에 파일이 정상적으로 열리면 타이머가 클리어됩니다.

신호 설명

기본 신호 이름

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

시그널 모듈에 속하지는 않지만 특정 프로세스에 시그널을 보내는 데 사용할 수 있습니다

시그널 사용 예

예 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 예외가 발생합니다. 그런 다음 예외가 캡처되고 기본값이 설정됩니다. 마지막으로 타이머를 취소하는 정리 작업이 수행됩니다. 기본값으로 설정합니다.

예제 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() 메서드를 2초마다 호출합니다. 변경, 호출 scrape.py를 실행하는 프로세스는 SIGHUP 신호를 보낸 다음 lib.py를 다시 로드하고 루프에서 수정된 scrape_me_bro() 메서드를 실행합니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.