Techniques avancées de terminaison
Décorateurs pour la terminaison de fonctions
Décorateur de délai d'attente
import signal
import functools
def timeout(seconds):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
def handler(signum, frame):
raise TimeoutError(f"L'appel de fonction a dépassé le délai d'attente après {seconds} secondes")
signal.signal(signal.SIGALRM, handler)
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0)
return result
return wrapper
return decorator
@timeout(2)
def long_running_function():
## Fonction qui peut prendre trop de temps
pass
Stratégies de terminaison contextuelle
Gestionnaires de contexte
class TerminationManager:
def __init__(self, max_iterations=100):
self.max_iterations = max_iterations
self.current_iteration = 0
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
## Logique de nettoyage ou de journalisation
pass
def check_termination(self):
self.current_iteration += 1
if self.current_iteration > self.max_iterations:
raise StopIteration("Nombre maximum d'itérations atteint")
def complex_computation():
with TerminationManager() as manager:
while True:
manager.check_termination()
## Logique de calcul
Visualisation du flux de terminaison
graph TD
A[Démarrer l'exécution] --> B{Conditions de terminaison}
B -->|Terminaison douce| C[Sortie gracieuse]
B -->|Terminaison brute| D[Arrêt immédiat]
C --> E[Nettoyage des ressources]
D --> F[Arrêt forcé]
Gestion avancée d'exceptions
Exceptions personnalisées de terminaison
class TerminationException(Exception):
def __init__(self, message, error_code=None):
self.message = message
self.error_code = error_code
super().__init__(self.message)
def critical_process():
try:
## Traitement complexe
if critical_condition:
raise TerminationException("Erreur critique détectée", error_code=500)
except TerminationException as e:
print(f"Terminaison : {e.message}")
## Gestion d'erreur personnalisée
Comparaison des méthodes de terminaison
Technique |
Complexité |
Cas d'utilisation |
Impact sur les performances |
Décorateurs |
Haute |
Flux de contrôle complexe |
Surcoût modéré |
Gestionnaires de contexte |
Moyenne |
Gestion des ressources |
Surcoût faible |
Exceptions personnalisées |
Basse |
Gestion d'erreurs |
Surcoût minimal |
Terminaison asynchrone
Arrêt de fonctions concurrentes
import asyncio
async def interruptible_task():
try:
await asyncio.sleep(10)
except asyncio.CancelledError:
## Logique de nettoyage lorsque la tâche est annulée
pass
async def main():
task = asyncio.create_task(interruptible_task())
await asyncio.sleep(5)
task.cancel() ## Terminer la tâche
Meilleures pratiques
- Construire des mécanismes de terminaison flexibles
- Minimiser les fuites de ressources
- Fournir un rapport d'erreur clair
- Utiliser une stratégie de terminaison appropriée
LabEx encourage les développeurs à maîtriser ces techniques avancées pour une programmation Python robuste.