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