J'ai un script Perl sur un système * nix qui, à un moment donné, traite plus de 50 000 lignes de texte. Cela prend du temps. J'essaie de trouver un moyen convivial de faire savoir à l'utilisateur que le programme ne se bloque pas pendant qu'il traite tout ce texte.
Actuellement, j'imprime la sortie en temps réel pendant le traitement du texte. Je vide le tampon de sortie, puis j'imprime la sortie sur une ligne avec \r
. Cela semble être une utilisation inutile des ressources car cela prend presque deux fois plus de temps que lorsque je n'imprime rien, mais comme je l'ai dit, lorsque vous n'imprimez rien, il semble que le programme se bloque.
Donc, ma question: existe-t-il un moyen standard ou simple de faire savoir à l'utilisateur que le programme est en cours d'exécution tout en effectuant des tâches de longue durée?
Réponses:
[Je viens de réaliser votre script est perl , mais la même logique applique,
print "\r"
etc. Vous voulez utiliserSTDERR
ou autre tour de mise en mémoire tampon,$| = 1
. Voir en bas.]Une façon de mettre en œuvre un "indicateur de progression" CLI implique l'utilisation du caractère
\r
(retour chariot). Cela amène le curseur au début de la ligne actuelle:Si cela n'a pas de sens, essayez-le.
Vous pouvez utiliser cette technique pour indiquer combien de lignes, ou des milliers de lignes, ont été traitées jusqu'à présent. Des dizaines ou des centaines de lignes peuvent être bonnes car ce n'est pas trop souvent (plus de mises à jour == un temps d'exécution plus lent) mais probablement encore assez souvent pour montrer que les progrès se poursuivent. Vous pouvez spécifier une unité ou simplement ajouter des zéros.
Notez l'utilisation de
-n
et-e
avececho
, c'est important.Vous pouvez également utiliser
\b
(retour arrière) pour un effet similaire.En perl:
la source
Imprimez un single
.
sans faire écho à une nouvelle ligne pendant que vous traitez. Technique séculaire.Vous obtenez donc:
Processing...............
Simple et efficace.
la source