Écrire des fonctions en Python
Shayne Miel
Software Architect @ Duo Security
def function1(): # Cette fonction s'exécute parfois # très, très longtemps ...def function2(): # Cette fonction se fige parfois # et ne retourne rien ...
@timeout def function1(): # Cette fonction s'exécute parfois # très, très longtemps ...@timeout def function2(): # Cette fonction se fige parfois # et ne retourne rien ...

import signaldef raise_timeout(*args, **kwargs): raise TimeoutError()# Quand un signal « alarm » se déclenche, appeler raise_timeout() signal.signal(signalnum=signal.SIGALRM, handler=raise_timeout)# Déclencher une alarme dans 5 secondes signal.alarm(5)# Annuler l'alarme signal.alarm(0)
def timeout_in_5s(func):@wraps(func) def wrapper(*args, **kwargs):# Régler une alarme à 5 secondes signal.alarm(5)try: # Appeler la fonction décorée return func(*args, **kwargs)finally: # Annuler l'alarme signal.alarm(0)return wrapper
@timeout_in_5s
def foo():
time.sleep(10)
print('foo!')
foo()
TimeoutError
def timeout(n_seconds):def decorator(func):@wraps(func) def wrapper(*args, **kwargs):# Régler une alarme à n secondes signal.alarm(n_seconds)try: # Appeler la fonction décorée return func(*args, **kwargs) finally: # Annuler l'alarme signal.alarm(0)return wrapperreturn decorator
@timeout(5) def foo(): time.sleep(10) print('foo!')@timeout(20) def bar(): time.sleep(10) print('bar!')foo()
TimeoutError
bar()
bar!
Écrire des fonctions en Python