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

Bry*_*anK 10 perl output

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

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

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

gol*_*cks 6

[我刚刚意识到你的脚本是perl,但同样的逻辑适用print "\r",等等。你会想要使用STDERR或关闭缓冲,$| = 1. 见底部。]

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

#!/bin/bash

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

如果它没有意义,那就试试吧。

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

注意-n-ewith的使用echo,这很重要。

您也可以使用\b(backspace) 达到类似的效果。


在 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++;
}               
Run Code Online (Sandbox Code Playgroud)