Heim > Backend-Entwicklung > Python-Tutorial > Python-Signalverarbeitungssignalmodul

Python-Signalverarbeitungssignalmodul

高洛峰
Freigeben: 2016-11-22 10:12:59
Original
1821 Leute haben es durchsucht

Einführung in das Signalmodul

Kürzlich habe ich Inhalte zum Thema Linux Signal gelesen, das für die Kommunikation zwischen Prozessen und die asynchrone Verarbeitung verwendet werden kann. Die Python-Standardbibliothek stellt das Signalpaket bereit, das zur Verarbeitung von Signalen verwendet werden kann. Was hier diskutiert wird, ist das Signalmodul von Python in Unix-Systemen.

Einfaches Signalbeispiel

Die offizielle Dokumentation enthält dieses Beispiel:

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)          # 关闭定时器
Nach dem Login kopieren

Die in diesem Beispiel implementierte Funktion besteht darin, einen Fehler beim Öffnen einer Datei oder andere Ausnahmen zu verhindern Stellen Sie im Wartezustand einen Timer ein und lösen Sie nach 5 Sekunden einen IOError aus. Wenn die Datei innerhalb von 5 Sekunden normal geöffnet wird, wird der Timer gelöscht.

Signalbeschreibung

Grundlegender Signalname

import signal

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

等等...
Nach dem Login kopieren

Allgemeine Signalverarbeitungsfunktionen

signal.signal(signalnum, handler)

Signalverarbeitungsfunktion einstellen

signal.alarm(time)

Timer für das Senden des SIGALRM-Signals einstellen

os.kill

Dies gehört nicht zum Signalmodul, kann aber zum Senden von Signalen an einen bestimmten Prozess verwendet werden

Signalverwendungsbeispiel

Beispiel 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
Nach dem Login kopieren

Im obigen Beispiel wurde die Funktion zum Festlegen des Zeitlimits für die Funktionsausführung implementiert, um Standardergebnisse zurückzugeben. Zunächst wird eine Timeout-Verarbeitungsfunktion eingerichtet und eine benutzerdefinierte Ausnahme in der Funktion ausgelöst. Legen Sie signal.alarm fest, bevor Sie die Funktion ausführen. Wenn die Zeit überschritten wird, wird die Ausnahme erfasst und der Standardwert festgelegt auf Standard gesetzt.

Beispiel 2

Dieses Beispiel stammt von hier. Die Anforderung besteht darin, von Python importierte Module dynamisch zu laden. Wenn also der importierte Modulcode aktualisiert wird, besteht die Hoffnung, dass der referenzierte Code sofort aktualisiert werden kann. Ein Beispiel ist wie folgt:

# 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()
Nach dem Login kopieren

Wenn scrape.py ausgeführt wird, ruft das Programm alle zwei Sekunden die Methode scrape_me_bro() in lib.py auf Änderungen, Aufruf Der Prozess, der scrape.py ausführt, sendet das SIGHUP-Signal und lädt dann lib.py neu, das dann die geänderte Methode scrape_me_bro() in einer Schleife ausführt.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage