Réessais et inspection¶
Objectif : réessayer une tâche qui échoue et suivre son état.
Ce que vous allez apprendre : max_attempts fixe le nombre d'essais d'une tâche.
Si le gestionnaire lève une erreur et qu'il reste des essais, la tâche est remise en file ; sinon elle passe en failed.
On inspecte l'état d'une tâche avec get_job et le nombre de tâches en attente avec pending_count.
Deuxième palier du niveau intermédiaire de la progression Jobs.
Ce que ce starter montre¶
- enfiler une tâche avec plusieurs essais via
max_attempts; - inspecter l'état d'une tâche avec
get_jobet la file avecpending_count.
Fonctions Forge utilisées¶
| Fonction | Rôle dans ce starter | Référence |
|---|---|---|
enqueue(task, payload, max_attempts=...) |
Enfile une tâche avec un nombre d'essais. | Opt-ins |
get_job(job_id) |
Renvoie l'état d'une tâche (Job) ou None. |
Opt-ins |
pending_count() |
Nombre de tâches en attente. | Opt-ins |
1. Enfiler avec des réessais¶
from forge_mvc_jobs import enqueue, get_job, pending_count
job_id = enqueue("rapport.genere", {"client": 42}, max_attempts=3)
print("en attente :", pending_count())
Comprendre ce code¶
max_attempts=3autorise jusqu'à trois essais pour cette tâche.- Si le gestionnaire lève une erreur et qu'il reste des essais, la tâche est remise en file.
- Une fois les essais épuisés, la tâche passe en statut
failed. - Une tâche sans gestionnaire associé est directement marquée
failed. pending_count()indique combien de tâches attendent encore d'être traitées.
Le réessai attend, il n'est pas immédiat
Une tâche remise en file n'est pas reprise tout de suite.
Elle attend un délai qui double à chaque tentative, soit 10, 20, 40, 80, 160, 320, puis 600 secondes au plus.
Ne vous étonnez donc pas de voir la tâche rester pending après un échec, sans qu'un nouvel essai parte : c'est le délai qui court, pas une panne.
Sans ce délai, une tâche qui échoue vite consommait ses trois essais en une fraction de seconde, ce qui ne laissait aucune chance à une panne passagère de se résorber.
2. Suivre l'état d'une tâche¶
job = get_job(job_id)
if job is not None:
print(job.status, job.attempts, "/", job.max_attempts)
if job.status == "failed":
print("dernière erreur :", job.last_error)
Comprendre ce code¶
get_job(job_id)renvoie un objetJobfigé, ouNonesi l'identifiant est inconnu.job.statusvautpending,running,doneoufailed.job.attemptscompte les essais déjà consommés ;job.max_attemptsest la limite.job.last_errorcontient le message du dernier échec, utile pour diagnostiquer.
À retenir¶
max_attemptsfixe le nombre d'essais ; l'échec remet en file tant qu'il en reste.- Le réessai attend un délai croissant, de 10 à 600 secondes : une tâche
pendingaprès un échec est normale. - Un worker tué laisse sa tâche en
running;forge jobs:reclaimla reprend, voir la page de référence. get_job(id)donne l'état complet d'une tâche (status,attempts,last_error).pending_count()mesure la charge restante de la file.
Après ce starter¶
Vous savez gérer les échecs et suivre les tâches.
Reste à ordonner la file, et à ne rien perdre en vol.