Le traitement des documents expire, ne laissez pas une tâche ralentir l'ensemble du lot
Un PDF numérisé est bloqué et les quatre-vingt-dix-neuf tâches suivantes ne bougeront pas. L'ajout d'un délai d'attente à la requête semble résoudre le problème, mais le processus de traitement réel peut encore consommer de la mémoire en arrière-plan. Les délais d'attente impliquent au moins trois actions : arrêter l'attente, arrêter l'exécution et marquer le produit comme non livrable.
Lors du traitement de documents par lots, le plus gênant n'est souvent pas l'erreur d'un seul fichier, mais le fait qu'une tâche soit bloquée et que toutes les tâches suivantes soient arrêtées dans la file d'attente. Par exemple, si un PDF numérisé est bloqué, les quatre-vingt-dix-neuf tâches suivantes ne bougeront pas. L'ajout d'un délai d'attente à la requête semble résoudre ce problème.
Mais le délai d'attente ne signifie pas que la tâche est terminée. Le traitement peut toujours s'exécuter en arrière-plan et continuer à occuper de la mémoire, ou le produit peut n'être qu'un produit semi-fini. Le délai d'attente comprend au moins trois actions : arrêter l'attente, arrêter l'exécution et marquer le produit comme non livrable. Après avoir lu cet article, vous devriez être en mesure de déterminer quelles preuves doivent être enregistrées après l'expiration du délai, dans quelles circonstances il est approprié de réessayer et comment séparer le temps d'attente du client de l'état de la tâche distante.
Cet article utilise des échantillons synthétiques pour démontrer la méthode de traitement. Le code a été vérifié avec des exemples dans un environnement isolé et ne constitue pas une garantie de tous les fichiers réels ou des performances du produit. Avant de traiter des documents importants, veuillez conserver les originaux et les examiner en fonction des limites et des éléments d'acceptation du texte.
Conclusion en une phrase
Le délai d'expiration des tâches par lots doit être décomposé en trois éléments : arrêter l'attente, arrêter l'exécution et marquer le produit comme non livrable. « Délai d'attente » ne peut pas être directement considéré comme « tâche terminée ».
| votre situation | Pratiques recommandées | raison |
|---|---|---|
| Je veux juste empêcher la page ou la file d'attente de rester bloquée | Arrêtez d'attendre et interrogez l'état de la tâche connue | Arrêter l'attente ne signifie pas que la tâche distante est terminée |
| Inquiétez-vous des processus en arrière-plan qui occupent de la mémoire | Confirmez que la résiliation est terminée et isolez-la avec un groupe de processus, un conteneur ou un objet de travail si nécessaire | subprocess.run(timeout=...) est valable pour les processus enfants directs et ne peut pas être généralisé au fait que l'intégralité de l'arborescence des processus a été nettoyée. |
| Le produit peut être un produit semi-fini | Marquez le produit temporaire comme non livrable et ne partagez pas le statut avec le résultat officiel | Le résultat d’une arrivée tardive après l’expiration du délai ne peut pas directement faire passer la tâche au succès. |
| Délais d'attente répétés pour la même entrée | Isolez les échantillons et vérifiez la complexité sans tentatives illimitées | Réessayer n’a de sens que lorsque l’échec est récupérable et que l’appel est suffisamment idempotent. |
Attendre le délai d'attente ne signifie pas que le travail est terminé
Le délai d'attente n'affecte que l'appelant
subprocess.run(timeout=...) peut expirer les processus enfants directs, mais cela ne garantit pas qu'une arborescence de processus a été nettoyée. Différents systèmes d'exploitation, méthodes de démarrage et comportement des processus petits-enfants affecteront les résultats. Pour les comportements associés, veuillez vous référer à Comportement de délai d'attente du sous-processus Python.
L'environnement de production nécessite une stratégie d'isolement
Les implémentations de production nécessitent généralement des moyens d'isolation tels que des groupes de processus, des conteneurs ou des objets de travail pour garantir que le travail associé s'arrête réellement après un délai d'attente.
Rédigez d'abord clairement le contrat de statut de la tâche
Ce qui suit simule uniquement la détermination de l'état, ne démarre pas de commandes externes et ne suspend pas intentionnellement le processus. Le point clé de sa démonstration est le suivant : une fois le délai atteint, même si une unité de travail arrive en retard avec un résultat, la tâche expirée ne peut pas être directement transformée en succès.
from dataclasses import dataclass
@dataclass(frozen=True)
class Decision:
state: str
deliver: bool
terminate_requested: bool
def decide(now, deadline, worker_done, artifact_valid):
if now >= deadline:
return Decision("timed_out", False, not worker_done)
if not worker_done:
return Decision("processing", False, False)
if not artifact_valid:
return Decision("invalid_artifact", False, False)
return Decision("verified", True, False)
assert decide(9, 10, False, False).state == "processing"
assert decide(10, 10, False, False).terminate_requested
assert not decide(11, 10, True, True).deliver
assert decide(9, 10, True, True).deliver
assert decide(9, 10, True, False).state == "invalid_artifact"
Ce protocole sélectionne un délai d'attente égal à la date limite. Vous pouvez également utiliser une autre limite, mais elle doit être écrite dans le test. Les comparaisons en temps réel doivent utiliser une horloge monotone adaptée à l'intervalle de calcul et ne pas permettre aux ajustements du fuseau horaire du système ou de l'horloge murale de modifier le budget de la tâche.
📊 Comparaison de base
| action | Problème résolu | Choses qui nécessitent encore de l'attention |
|---|---|---|
| arrête d'attendre | L'appelant n'est plus bloqué | Le travail à distance ou en arrière-plan peut encore être en cours |
| Arrêter l'exécution | Libérer les ressources occupées par le processus | Mettre fin à la demande ne signifie pas quitter et nécessite une confirmation. |
| Marquer le produit comme non livrable | Empêcher la livraison de produits semi-finis par erreur | Besoin de sauvegarder le statut séparément des résultats officiels |
Quelles preuves reste-t-il après le délai d'attente ?
Après un délai d'attente, un seul délai d'attente ne peut pas être enregistré dans le journal. Les informations suivantes peuvent vous aider à déterminer où se situe le problème :
| Ce que vous devez savoir | utiliser | Avis |
|---|---|---|
| phase d'expiration | Distinguer téléchargement, analyse ou traduction | N'oubliez pas qu'il n'y a pas qu'un seul temps mort |
| La résiliation est-elle confirmée ? | Empêcher les restes de travail en arrière-plan | Demander la résiliation ne signifie pas quitter |
| identité temporaire du produit | Évitez les erreurs de livraison de produits semi-finis | Ne partage pas le statut avec les résultats officiels |
| Nombre de tentatives | Contrôler le budget global | Le temps illimité ne peut pas être récupéré à chaque fois |
Réessayer n'est pas une étape suivante automatique
Vérifiez d'abord si les ressources sont épuisées à plusieurs reprises au cours de la même étape
Si la même entrée consomme des ressources à la même étape à chaque fois, vous devez isoler l'échantillon et résoudre le problème de complexité au lieu de continuer à réessayer.
Distinguer deux types d'invites
Les utilisateurs doivent être capables de distinguer deux situations :
- Le service est occupé, nouvelle tentative : vous pouvez attendre.
- L'entrée n'est pas prise en charge et doit être traitée : une intervention manuelle ou un remplacement d'entrée est requis.
🎯 Quelle méthode vous convient ?
Si vous traitez de gros lots de documents
Fixez un délai indépendant pour chaque tâche. Après l'expiration d'une tâche, elle ne fait que se marquer elle-même et n'arrête pas l'ensemble du lot.
Si vous vous inquiétez des fuites de ressources
Après l'expiration du délai, confirmez si la résiliation est réellement terminée et isolez-la au niveau du conteneur ou du groupe de processus. Ne vous fiez pas uniquement au délai d'attente du processus enfant direct.
Si vous souhaitez vous connecter à une plateforme de traduction en ligne
Le temps d'attente du client, l'état de traitement de la plateforme et l'état de téléchargement des fichiers doivent être représentés séparément. Vérifiez les tâches connues avant de cliquer à nouveau pour éviter une consommation répétée.
❓ Questions fréquemment posées (FAQ)
1. Si un timeout est ajouté à la requête, pourquoi l'exécution doit-elle être arrêtée ?
Après l'expiration du délai, le processus de traitement peut toujours s'exécuter en arrière-plan et occuper de la mémoire. Arrêter d’attendre ne libérera pas automatiquement ces ressources.
2. La tâche échouera-t-elle définitivement après l'expiration du délai ?
incertain. Cependant, le résultat tardif après l'expiration du délai ne peut pas directement faire passer la tâche au succès et doit être déterminé en fonction du statut du contrat.
3. Quand est-il approprié de réessayer ?
Réessayer n’a de sens que si la cause de l’échec est récupérable et si l’appel est suffisamment idempotent. Si la même entrée consomme des ressources à la même étape à chaque fois, elle doit d’abord être isolée et étudiée.
4. Quelles preuves doivent être enregistrées après le temps mort ?
Enregistrez au moins la phase d'expiration, si la résiliation est confirmée, l'identité du produit temporaire et le nombre de tentatives.
📝Résumé
La clé du délai d'attente est de gérer séparément "arrêter l'attente", "arrêter l'exécution" et "si le produit peut être livré". Si l'état de la tâche est clair, le lot ne sera pas retardé par un seul fichier.


