Exemples de retards dans le monde réel
1. Limitation du débit des requêtes API
Fréquence de requêtes API contrôlée
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. Mécanisme de nouvelle tentative avec backoff exponentiel
Récupération intelligente des erreurs
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. Planification de tâches périodiques
Exécution de tâches en arrière-plan
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()
Comparaison des stratégies de retard
| Scénario |
Méthode de retard |
Précision |
Cas d'utilisation |
| Requêtes API |
time.sleep() |
Au niveau des secondes |
Limitation du débit |
| Récupération d'erreur |
Backoff exponentiel |
Croissante |
Mécanisme de nouvelle tentative |
| Tâches en arrière-plan |
threading.Timer() |
Configurable |
Exécution périodique |
Diagramme de flux de sélection de la méthode de retard
graph TD
A[Besoin de retard] --> B{Type de retard}
B -->|Intervalle constant| C[Tâche périodique]
B -->|Récupération d'erreur| D[Backoff exponentiel]
B -->|Gestion des ressources| E[Limitation du débit]
C --> F[Utiliser le threading]
D --> G[Implémenter la logique de nouvelle tentative]
E --> H[Exécution contrôlée]
Considérations avancées
- Implémenter une gestion d'erreurs appropriée
- Utiliser des mécanismes de journalisation adaptés
- Prendre en compte les contraintes des ressources système
- Équilibrer le retard et les performances