<div dir="ltr">Ola<div><br></div><div>Eu tenho o seguinte caso</div><div><br></div><div>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 ).</div>

<div><br></div><div>a cada minuto quero enviar o valor de total para algum lugar (ex Zabbix).</div><div><br></div><div>a meia noite eu quero limpar o total para 0.</div><div><br></div><div><div>Eu cheguei a algo assim:</div>

<div>use AnyEvent;</div><div><br></div><div>sub loop {</div><div><span class="" style="white-space:pre">      </span>my $obj   = Foo->new;</div><div><span class="" style="white-space:pre">   </span>my $cv    = AE::cv;</div><div>

<br></div><div><div><span class="" style="white-space:pre"><span class="">    </span>my $</span>seconds_in_a_day = 60 * 60 * 24;</div><div><span class="" style="white-space:pre">  </span>my $seconds_to_midnight =  $seconds_in_a_day - seconds_from_midnight();</div>

</div><div><br></div><div><span class="" style="white-space:pre">       </span>my $loop = AE::timer  0, 1,  sub { $obj->run   };</div><div><br></div><div><span class="" style="white-space:pre">      </span>my $send = AE::timer  60, 60,  sub { $obj->send  };</div>

<div><br></div><div><span class="" style="white-space:pre">   </span>my $clear= AE::timer  $seconds_to_midnight, $seconds_in_a_day,  sub { $obj->clear };</div><div><span class="" style="white-space:pre">    </span></div><div>

<span class="" style="white-space:pre">       </span>$cv->recv;</div><div>}</div><div><br></div><div>a sub seconds_from_midnight usa localtime pra fazer uma conta marota.</div><div><br></div><div>A assinatura do AE::timer eh</div>

<div><br></div><div>AE::timer $delay, $interval, $callback;</div><div><br></div><div>No primeiro timer eu tenho o meu main loop, chamando o metodo run.</div><div>No segundo eu tenho o metodo que envia os dados a cada 60 segundos</div>

<div>No terceiro eu calculo quantos segundos faltam para a meia noite e mando repetir a cada 24 horas.</div><div><br></div><div>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. </div>

<div><br></div><div>Parece bom, mas eu tenho algumas duvidas.</div><div><br></div><div>1) esta claro o suficiente?</div><div>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?</div>

<div>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?</div>

<div>4) alias tem algo melhor do que ficar brincando com localtime() pra pegar quantos segundos faltam pra proxima meia noite? algo usando DateTime</div><div><br></div><div>por fim</div><div><br></div><div>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".</div>

<div><br></div><div>Obrigado</div><div><br></div><div>Tiago</div><div><br>-- </div>Tiago B. Peczenyj<br>Linux User #405772<br><br><a href="http://about.me/peczenyj" target="_blank">http://about.me/peczenyj</a>
</div></div>