Ich habe ein Perl-Skript auf einem * nix-System, das zu einem bestimmten Zeitpunkt mehr als 50.000 Textzeilen verarbeitet. Dies dauert einige Zeit. Ich versuche einen ressourcenfreundlichen Weg zu finden, um den Benutzer wissen zu lassen, dass das Programm nicht hängt, während es den gesamten Text verarbeitet.
Derzeit drucke ich die Ausgabe in Echtzeit, während der Text verarbeitet wird. Ich spüle den Ausgabepuffer und drucke dann die Ausgabe in einer Zeile mit \r
. Dies scheint ein unnötiger Ressourcenverbrauch zu sein, da es fast doppelt so lange dauert, als wenn ich nichts drucke, aber wie gesagt, wenn ich nichts drucke, sieht es so aus, als ob das Programm hängen bleibt.
Meine Frage: Gibt es eine Standard- oder einfache Möglichkeit, den Benutzer darüber zu informieren, dass das Programm tatsächlich ausgeführt wird, während lang laufende Aufgaben ausgeführt werden?
Antworten:
[Ich habe gerade festgestellt, dass Ihr Skript Perl ist , aber es gilt dieselbe Logik
print "\r"
usw. Sie möchtenSTDERR
die Pufferung verwenden oder deaktivieren$| = 1
. Siehe unten.]Eine Möglichkeit zum Implementieren einer CLI- "Fortschrittsanzeige" besteht in der Verwendung des
\r
Zeichens (Wagenrücklauf). Dies bringt den Cursor an den Anfang der aktuellen Zeile:Wenn es keinen Sinn ergibt, probieren Sie es einfach aus.
Mit dieser Technik können Sie angeben, wie viele Zeilen oder Tausende von Zeilen bisher verarbeitet wurden. Zehn oder Hunderte von Zeilen können gut sein, da es nicht zu oft ist (mehr Updates == langsamere Laufzeit), aber wahrscheinlich immer noch oft genug, um zu zeigen, dass der Fortschritt fortgesetzt wird. Sie können eine Einheit angeben oder einfach Nullen anhängen.
Beachten Sie die Verwendung von
-n
und-e
mitecho
, das ist wichtig.Sie können auch
\b
(Rücktaste) verwenden, um einen ähnlichen Effekt zu erzielen.In Perl:
quelle
Drucken Sie eine einzelne aus,
.
ohne während der Verarbeitung einen Zeilenumbruch zu wiederholen. Uralte Technik.So bekommen Sie:
Processing...............
Einfach und effektiv.
quelle