[SP-pm] rodar coisas periodicas em perl

Tiago Peczenyj tiago.peczenyj at gmail.com
Sun Aug 25 18:54:06 PDT 2013


Ola

Eu tenho o seguinte caso

preciso rodar um certo método a cada segundo, que por sua vez acumula um
valor em algum atributo interno do objeto ( total += por exemplo ).

a cada minuto quero enviar o valor de total para algum lugar (ex Zabbix).

a meia noite eu quero limpar o total para 0.

Eu cheguei a algo assim:
use AnyEvent;

sub loop {
my $obj   = Foo->new;
my $cv    = AE::cv;

my $seconds_in_a_day = 60 * 60 * 24;
my $seconds_to_midnight =  $seconds_in_a_day - seconds_from_midnight();

my $loop = AE::timer  0, 1,  sub { $obj->run   };

my $send = AE::timer  60, 60,  sub { $obj->send  };

my $clear= AE::timer  $seconds_to_midnight, $seconds_in_a_day,  sub {
$obj->clear };
 $cv->recv;
}

a sub seconds_from_midnight usa localtime pra fazer uma conta marota.

A assinatura do AE::timer eh

AE::timer $delay, $interval, $callback;

No primeiro timer eu tenho o meu main loop, chamando o metodo run.
No segundo eu tenho o metodo que envia os dados a cada 60 segundos
No terceiro eu calculo quantos segundos faltam para a meia noite e mando
repetir a cada 24 horas.

hoje eu tenho um loop com um sleep 1 e varios ifs. quero que fique mais
legivel e nao utilizo anyEvent em nenhum outro lugar. Nao precisa ser
EXATO, portanto um atraso de alguns segundos pode acontecer.

Parece bom, mas eu tenho algumas duvidas.

1) esta claro o suficiente?
2) o overhead do AnyEvent parece ser o mesmo do sleep (1) durante o runtime
(ignorando quanto tempo demora pra iniciar ou não), certo?
3) para rodar algo "a meia noite" me parece um tanto confuso ainda. não
encontrei nenhum helper q me ajude (o AnyEvent::Cron da pau pra mim). sera
q nao eh melhor "re-setar" o time watcher para a proxima meia noite?
4) alias tem algo melhor do que ficar brincando com localtime() pra pegar
quantos segundos faltam pra proxima meia noite? algo usando DateTime

por fim

5) tem algum problema ao usar AE::timer q eu não esteja vendo? Fora os
problemas interentes como se eu usar IO Bloqueante eu não vou ter os timers
"exatos".

Obrigado

Tiago

-- 
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130826/9a5f1827/attachment.html>


More information about the SaoPaulo-pm mailing list