资源友好的方式向用户指示程序没有挂起

资源友好的方式向用户指示程序没有挂起

我在 *nix 系统上有一个 Perl 脚本,该脚本在某一时刻正在处理 50,000 多行文本。这需要一些时间。我试图找到一种资源友好的方式,让用户知道程序在处理所有这些文本时没有挂起。

目前,我正在处理文本时实时打印输出。我正在刷新输出缓冲区,然后将输出打印在一行上\r。这似乎是对资源的不必要的使用,因为它花费的时间几乎是我不打印任何内容时的两倍,但正如我所说,当不打印任何内容时,程序看起来像是挂起的。

所以我的问题是:是否有一种标准或简单的方法可以让用户知道程序在执行长时间运行的任务时确实正在运行?

答案1

[我刚刚意识到你的剧本是珀尔,但同样的逻辑也适用,print "\r"等等。您将需要使用STDERR或关闭缓冲,$| = 1。见底部。]

实现 CLI“进度指示器”的一种方法涉及使用\r(回车)字符。这会将光标移至当前行的开头:

#!/bin/bash

count=0
while ((1)); do
    echo -ne "\rCount: $count"
    sleep 1;
    count=$(($count+1));
done     

如果没有意义,就尝试一下。

您可以使用该技术来指示到目前为止已处理了多少行或数千行。数十行或数百行可能会很好,因为它不是太频繁(更多更新==较慢的运行时间),但可能仍然足够频繁以显示进度正在继续。您可以指定单位或仅附加零。

-n请注意和-e的使用echo,这很重要。

您还可以使用\b(退格键)达到类似的效果。


在 Perl 中:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

$| = 1;  # Pipeline stdout (i.e., no buffering).

my $count = 1;
while ($count) {
    print "\rCount $count";
    sleep 1;
    $count++;
}               

答案2

.在处理时打印出一个而不回显换行符。古老的技术。

所以你得到:

Processing...............

简单有效。

相关内容