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 situationPratiques recommandéesraison
Je veux juste empêcher la page ou la file d'attente de rester bloquéeArrêtez d'attendre et interrogez l'état de la tâche connueArrê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émoireConfirmez que la résiliation est terminée et isolez-la avec un groupe de processus, un conteneur ou un objet de travail si nécessairesubprocess.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-finiMarquez le produit temporaire comme non livrable et ne partagez pas le statut avec le résultat officielLe 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éeIsolez les échantillons et vérifiez la complexité sans tentatives illimitéesRé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

actionProblème résoluChoses qui nécessitent encore de l'attention
arrête d'attendreL'appelant n'est plus bloquéLe travail à distance ou en arrière-plan peut encore être en cours
Arrêter l'exécutionLibérer les ressources occupées par le processusMettre fin à la demande ne signifie pas quitter et nécessite une confirmation.
Marquer le produit comme non livrableEmpêcher la livraison de produits semi-finis par erreurBesoin 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 savoirutiliserAvis
phase d'expirationDistinguer téléchargement, analyse ou traductionN'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-planDemander la résiliation ne signifie pas quitter
identité temporaire du produitÉvitez les erreurs de livraison de produits semi-finisNe partage pas le statut avec les résultats officiels
Nombre de tentativesContrôler le budget globalLe 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.

Essayez-le maintenant : téléchargez le document pour lancer la traduction, en conservant la mise en page d'origine.

Mis à jour le 2026-11-15