How can I tell Perl to run some code every 20 seco

2020-06-10 02:08发布

How can I tell Perl to run some code every 20 seconds?

标签: perl
8条回答
看我几分像从前
2楼-- · 2020-06-10 02:44

Go with ..

while () {
  sleep 20;
  #Code here
}
查看更多
成全新的幸福
3楼-- · 2020-06-10 02:45
while (1) {
        sleep 20;
        <your code here>;
}
查看更多
狗以群分
4楼-- · 2020-06-10 02:45

Set up a SIGALRM handler, and send yourself a signal every 20 seconds with alarm (see perldoc -f alarm):

$SIG{ALRM} = sub {
    # set up the next signal for 20 seconds from now
    alarm 20;

    # do whatever needs to be done
    # ...
};

This will experience drift over time, as each signal may be delayed by up to a second; if this is important, set up a cron job instead. Additionally, even more drift will happen if your other code takes upwards of 20 seconds to run, as only one timer can be counting at once. You could get around this by spawning off threads, but at this point, I would have already gone back to a simple cron solution.

Choosing the proper solution is dependent on what sort of task you need to execute periodically, which you did not specify.

查看更多
祖国的老花朵
5楼-- · 2020-06-10 02:48
for (;;) {
    my $start = time;
    # your code;
    if ((my $remaining = 20 - (time - $start)) > 0) {
        sleep $remaining;
    }
}
查看更多
爷、活的狠高调
6楼-- · 2020-06-10 02:49

It is better to use some event library. There are a couple of choices:

IO::Async::Timer::Periodic

use IO::Async::Timer::Periodic;

use IO::Async::Loop;
my $loop = IO::Async::Loop->new;

my $timer = IO::Async::Timer::Periodic->new(
   interval => 60,

   on_tick => sub {
      print "You've had a minute\n";
   },
);

$timer->start;

$loop->add( $timer );

$loop->run;

AnyEvent::DateTime::Cron

AnyEvent::DateTime::Cron->new()
    ->add(
        '* * * * *'   => sub { warn "Every minute"},
        '*/2 * * * *' => sub { warn "Every second minute"},
      )
    ->start
    ->recv

EV::timer

etc.

查看更多
疯言疯语
7楼-- · 2020-06-10 03:02

While the sleep function will work for some uses, if you're trying to do "every 20 seconds, forever", then you're better off using an external utility like cron.

In addition to the possible issue of drift already mentioned, if your sleep script exits (expectedly or otherwise), then it's not going to run again at the next 20 second mark.

@Blrfl is correct, and I feel sheepish. That said, it's easy enough to overcome.

* * * * * /path/to/script.pl
* * * * * sleep 20 && /path/to/script.pl
* * * * * sleep 40 && /path/to/script.pl

You could also take a hybrid approach of putting a limited count sleep loop in the script and using cron to run it every X minutes, covering the case of script death. Anything more frequent than 20 seconds, I would definitely take that approach.

查看更多
登录 后发表回答