perl - 定期在屏幕上打印而不睡觉()

时间:2013-12-10 13:18:30

标签: multithreading perl time intervals periodic-task

我一直使用perl进行编码,我正在进行一些计算,这需要花费一些时间进行长时间的循环...循环的大小由用户给出。

所以在每十秒钟左右,我想在屏幕上打印一些信息,而不使用睡眠功能,因为还有其他事情发生,我不想浪费时间在睡眠功能上。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果你想在每五秒钟之后在一个长循环中打印一些东西,你可以做这样的事情(伪代码,但你明白了):

tLast = currentTime modulo interval

for (some long loop):
  tNow = currentTime modulo interval
  if tNow < tLast:
    print "something"
  tLast = tNow
  doSomethingElse

如果循环非常紧,这会增加太多开销,请执行

for (some long loop):
  tNow = currentTime modulo interval
  if tNow < tLast:
    print "something"
  tLast = tNow
  for(some tight loop):
     doSomethingElse

现在对时间的检查“只是经常发生” - 所以对于最紧密的循环没有开销,只是对于不太紧的外环(这实际上是我在第一次评论中提出的组合,以及我后来提出的建议。)

答案 1 :(得分:1)

通常这不是问题。因为你的工作进展顺利。依靠这一进步,您偶尔可以打印一些东西。

但是如果你想要每10秒打印一次,最好使用另一个线程每隔10秒向用户打印一次进度并sleep()功能。

你也可以直接处理时钟,即保持startTime并计算currentTime,如果他们differenceInSeconds % 10 == 0然后打印一些东西。

答案 2 :(得分:1)

use threads;

async {
  my $i = 0;
  LOOP: {
    print $i++, "\n";
    sleep 10;
    redo LOOP;
  }
};

# rest of program..

答案 3 :(得分:1)

您可以使用Smart::Comments生成进度条。

use Smart::Comments;
use Time::HiRes qw(usleep);
### process started
for my $n (0..1000000) { ### Initializing...  done
    usleep 5; #...simulate work...
}
### process ended
1;

哪会产生:

### process started
Initializing..............     done