[PYTHON] Dekorateur, der etwas tut, wenn die Funktion nicht innerhalb der angegebenen Zeit beendet wird

Dies ist eine verbesserte Version der Tipps, die ich gestern gepostet habe. Der zu benachrichtigende Teil wird durch Übergeben einer Handlerfunktion getrennt, so dass eine beliebige Verarbeitung durchgeführt werden kann.

Ich habe auch versucht, functools.wrap zu verwenden, was mir @methane beigebracht hat. Ich habe versucht, die Funktion mit diesem Dekorateur in @task of paver zu verwenden, aber die Hilfe war None und der Docstring wurde nicht angezeigt, weil ich ihn nicht verwendet habe! (Als ich functools.wrap verwendet habe, habe ich eine Dokumentzeichenfolge in der Hilfe)

timeout.py


from functools import wraps

def on_timeout(limit, handler, hint=None):
    '''                                                                                                    
Wenn es nicht in der angegebenen Ausführungszeit beendet wird, geben Sie den Handler an/Call mit Limit als Argument
    @on_timeout(limit=3600, handler=notify_func, hint=u'Lange Berechnung')                                         
    def long_time_function():                                                                              
    '''
    def notify_handler(signum, frame):
        handler("'%s' is not finished in %d second(s)." % (hint, limit))

    def __decorator(function):
        def __wrapper(*args, **kwargs):
            import signal
            signal.signal(signal.SIGALRM, notify_handler)
            signal.alarm(limit)
            result = function(*args, **kwargs)
            signal.alarm(0)
            return result
        return wraps(function)(__wrapper)
    return __decorator

Die tatsächliche Verwendung ist wie folgt

main.py



from timeout import on_timeout

def handler_func(msg):
    print msg #Führen Sie tatsächlich eine entsprechende Benachrichtigungsverarbeitung durch

@on_timeout(limit=1, handler=handler_func, hint=u'Lange Berechnung')
def long_time_function():
    import time
    time.sleep (2)

if __name__ == "__main__":
    long_time_function()
 

Wenn dies ausgeführt wird, ist der Prozess Ruhezustand (2), obwohl das Limit 1 Sekunde beträgt. Daher wird handler_func nach 1 Sekunde aufgerufen und die Anzeige sieht wie folgt aus.

'Lange Berechnung' is not finished in 1 second(s).

Damit scheint es, dass es auf andere als AWS angewendet werden kann.

Recommended Posts

Dekorateur, der etwas tut, wenn die Funktion nicht innerhalb der angegebenen Zeit beendet wird
Dekorateur, der AWS-SNS benachrichtigt, wenn die Funktion nicht innerhalb der angegebenen Zeit beendet wird
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Was bedeutet das letzte () in einer Funktion in Python?
So erstellen Sie eine neue Datei, wenn die angegebene Datei nicht vorhanden ist - schreiben Sie, wenn die Datei vorhanden ist
Machen Sie einen Funktionsdekorateur
Grep, damit grep zum Zeitpunkt von grep nicht angezeigt wird
Ich habe eine Funktion erstellt, um zu überprüfen, ob der Webhook vorerst in Lambda empfangen wird