[SP-pm] rodar coisas periodicas em perl

Stanislaw Pusep creaktive at gmail.com
Sun Aug 25 22:27:49 PDT 2013


Use AE::time() no lugar do localtime

понедельник, 26 августа 2013 г. пользователь Tiago Peczenyj писал:

> 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
>
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130826/44755b97/attachment.html>


More information about the SaoPaulo-pm mailing list