Ejemplos de retraso en el mundo real
1. Limitación de la tasa de solicitudes a una API
Frecuencia controlada de llamadas a una API
import time
import requests
def rate_limited_api_call(urls, delay=1):
results = []
for url in urls:
try:
response = requests.get(url)
results.append(response.json())
time.sleep(delay) ## Prevent overwhelming API
except requests.RequestException as e:
print(f"Error accessing {url}: {e}")
return results
urls = [
'https://api.example.com/endpoint1',
'https://api.example.com/endpoint2'
]
results = rate_limited_api_call(urls)
2. Mecanismo de reintentos con retroceso exponencial
Recuperación inteligente de errores
import time
def retry_with_backoff(func, max_retries=3):
for attempt in range(max_retries):
try:
return func()
except Exception as e:
wait_time = 2 ** attempt ## Exponential delay
print(f"Retry attempt {attempt + 1}, waiting {wait_time} seconds")
time.sleep(wait_time)
raise Exception("Max retries exceeded")
def unreliable_operation():
## Simulated unstable operation
import random
if random.random() < 0.7:
raise ValueError("Operation failed")
return "Success"
retry_with_backoff(unreliable_operation)
3. Programación de tareas periódicas
Ejecución de tareas en segundo plano
import threading
import time
class PeriodicTask:
def __init__(self, interval, function):
self.interval = interval
self.function = function
self.stop_event = threading.Event()
self.thread = threading.Thread(target=self._run)
def _run(self):
while not self.stop_event.is_set():
self.function()
time.sleep(self.interval)
def start(self):
self.thread.start()
def stop(self):
self.stop_event.set()
self.thread.join()
def monitor_system():
print("Checking system status for LabEx...")
## Run periodic task every 5 seconds
periodic_monitor = PeriodicTask(5, monitor_system)
periodic_monitor.start()
## Stop after 1 minute
time.sleep(60)
periodic_monitor.stop()
Comparación de estrategias de retraso
| Escenario |
Método de retraso |
Precisión |
Caso de uso |
| Solicitudes a una API |
time.sleep() |
A nivel de segundos |
Limitación de la tasa |
| Recuperación de errores |
Retroceso exponencial |
Creciente |
Mecanismo de reintentos |
| Tareas en segundo plano |
threading.Timer() |
Configurable |
Ejecución periódica |
Diagrama de flujo de selección del método de retraso
graph TD
A[Requisito de retraso] --> B{Tipo de retraso}
B -->|Intervalo constante| C[Tarea periódica]
B -->|Recuperación de errores| D[Retroceso exponencial]
B -->|Gestión de recursos| E[Limitación de la tasa]
C --> F[Usar threading]
D --> G[Implementar lógica de reintentos]
E --> H[Ejecución controlada]
Consideraciones avanzadas
- Implementar un manejo adecuado de errores
- Utilizar mecanismos de registro (logging) apropiados
- Tener en cuenta las restricciones de recursos del sistema
- Equilibrar entre retraso y rendimiento