Fonction de délai d'attente avec une durée prédéfinie
Dans les scripts shell, il est utile d'avoir un mécanisme pour terminer les tâches de longue durée afin d'éviter une attente excessive . Le défi rencontré ici est d'envelopper une fonction dans un script de délai d'attente, renvoyant False si elle dépasse un délai spécifié.
Une approche consiste à définir un minuteur asynchrone qui déclenche une réponse False après un intervalle prédéfini. Heureusement, une telle solution est réalisable à l'aide des gestionnaires de signaux de la bibliothèque signal (disponible sur les systèmes basés sur UNIX).
Le processus implique la création d'un décorateur personnalisé (@timeout) qui exploite le signal. alarm() pour définir une alarme pour l’intervalle de temps souhaité. Dans la fonction décorée, lorsque l'alarme expire, une exception TimeoutError est déclenchée, interrompant effectivement l'opération.
Pour incorporer cette solution dans votre code, enregistrez le code suivant sous timeout.py et importez-le :
import errno import os import signal import functools class TimeoutError(Exception): pass def timeout(seconds=10, error_message=os.strerror(errno.ETIME)): def decorator(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) @functools.wraps(func) def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(seconds) try: result = func(*args, **kwargs) finally: signal.alarm(0) return result return wrapper return decorator
Maintenant, dans le code de votre application, annotez toute fonction potentiellement longue avec le décorateur @timeout. Par exemple :
from timeout import timeout # Short timeout @timeout(5) def slow_function(): # ... # Default timeout @timeout def another_slow_function(): # ... # Customize timeout and error message @timeout(30, error_message="Task timed out") def yet_another_slow_function(): # ...
Cette approche garantit que si une fonction prend plus de temps que l'intervalle de délai d'attente spécifié, elle déclenchera une TimeoutError et renverra False, vous permettant de gérer les retards inattendus avec élégance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!