Técnicas Avanzadas de Terminación
Decoradores para la Terminación de Funciones
Decorador de Tiempo Limite
import signal
import functools
def timeout(seconds):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
def handler(signum, frame):
raise TimeoutError(f"La llamada a la función se agotó después de {seconds} segundos")
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():
## Función que puede tardar demasiado tiempo
pass
Estrategias de Terminación Contextual
Gestores de Contexto
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):
## Lógica de limpieza o registro
pass
def check_termination(self):
self.current_iteration += 1
if self.current_iteration > self.max_iterations:
raise StopIteration("Se alcanzó el número máximo de iteraciones")
def complex_computation():
with TerminationManager() as manager:
while True:
manager.check_termination()
## Lógica de cálculo
Visualización del Flujo de Terminación
graph TD
A[Iniciar la Ejecución] --> B{Condiciones de Terminación}
B -->|Terminación Suave| C[Salida Óptima]
B -->|Terminación Dura| D[Parada Inmediata]
C --> E[Limpieza de Recursos]
D --> F[Apagado Forzado]
Manejo Avanzado de Excepciones
Excepciones Personalizadas de Terminación
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:
## Procesamiento Complejo
if critical_condition:
raise TerminationException("Se detectó un error crítico", error_code=500)
except TerminationException as e:
print(f"Terminación: {e.message}")
## Manejo de errores personalizado
Comparación de Métodos de Terminación
| Técnica |
Complejidad |
Caso de Uso |
Impacto en el Rendimiento |
| Decoradores |
Alta |
Flujo de control complejo |
Sobrecarga moderada |
| Gestores de Contexto |
Media |
Gestión de recursos |
Sobrecarga baja |
| Excepciones Personalizadas |
Baja |
Manejo de errores |
Sobrecarga mínima |
Terminación Asíncrona
Detención de Funciones Concurrentes
import asyncio
async def interruptible_task():
try:
await asyncio.sleep(10)
except asyncio.CancelledError:
## Lógica de limpieza cuando la tarea es cancelada
pass
async def main():
task = asyncio.create_task(interruptible_task())
await asyncio.sleep(5)
task.cancel() ## Terminar la tarea
Mejores Prácticas
- Diseñar mecanismos de terminación flexibles
- Minimizar fugas de recursos
- Proporcionar informes de error claros
- Utilizar la estrategia de terminación adecuada
LabEx anima a los desarrolladores a dominar estas técnicas avanzadas para un programación de Python robusta.