<div dir="ltr">Bom,<div><br></div><div style>Ótimo, não tinha pensando no 'send' no SIGTERM, mas realmente faz sentido e evita eu criar uma tratamento especial para este cara.</div><div style><br></div><div style>Obrigado,</div>

<div style><br></div><div style>Solli Honorio</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">Em 23 de fevereiro de 2013 11:35, Stanislaw Pusep <span dir="ltr"><<a href="mailto:creaktive@gmail.com" target="_blank">creaktive@gmail.com</a>></span> escreveu:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Quanto aos leaks: existe um módulo especialmente voltado para detecção de<br>
leaks em aplicativos feitos com AnyEvent, Devel::Leak::Cb (nunca cheguei a<br>
usar; mas, em todo caso...)<br>
Me corrija se eu estiver errado, mas o seu aplicativo é uma espécie de um<br>
daemon, que só pára quando mandarem parar, correto? Se for o caso,<br>
conditional variables se tornam irrelevantes. O propósito dos<br>
AnyEvent->condvar é criar "checkpoints". Isso é, sincronizar o que é<br>
assíncrono. Isso somente se faz necessário quando existe interdependência<br>
de dois (ou mais) fluxos. Exemplo: você dispara ping para vários hosts e<br>
reporta o de menor latência ("checkpoint": todos precisam retornar ou dar<br>
timeout). Outro exemplo: baixar uma fila de N URLs em paralelo, sem exceder<br>
K conexões simultâneas ("checkpoint" periódico: verificar se K == conexões<br>
ativas e tomar providências).<br>
Agora, um servidor HTTP seria um contra-exemplo: os requests não dependem<br>
um do outro (sorry, Microsoft).<br>
Resumindo a história: você pode muito bem criar um único $cv =<br>
AnyEvent->condvar; e depois de inicializar todos os callbacks, dar um único<br>
$cv->recv. E o único cara que enviará o $cv->send será um hook no SIGTERM.<br>
Já os guards dos streams, você está fazendo isso certo. Mantenha-os num<br>
hash e apague-os conforme perecem.<br>
<br>
P.S. - assumi várias coisas idiossincráticas para mim aqui; não que seja a<br>
melhor forma para resolver o seu problema, mas é por onde eu começaria :)<br>
<br>
<br>
ABS()<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
2013/2/22 Solli Honorio <<a href="mailto:shonorio@gmail.com">shonorio@gmail.com</a>><br>
<br>
><br>
> Estou com um sistema que abre vários stream no twitter e fica processando<br>
> cada retorno, para isto estou utilizando o AnyEvent::Twitter::Stream.<br>
><br>
> Uma versão simplificada do meu código é assim :<br>
><br>
> <code><br>
>   use common::sense;<br>
>   use AnyEvent;<br>
>   use AnyEvent::Twitter::Stream;<br>
><br>
>   # Definição de variáveis globais<br>
>   my %process<br>
>   my %CONFIG = load_from_database_my_configuration();<br>
><br>
>   my $done = AnyEvent->condvar;<br>
><br>
>   for my $key ( keys %CONFIG ) {<br>
>     $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );<br>
>   }<br>
><br>
>   # running<br>
><br>
><br>
>   sub create_twitter_stream {<br>
>     my ($key, $config) = @_;<br>
><br>
>     # cria uma transação para este stream<br>
>     $done->begin;<br>
><br>
>     return AnyEvent::Twitter::Stream->new(<br>
>             consumer_secret => $config->{consumer_secret},<br>
>             consumer_key    => $config->{consumer_key},<br>
>             token           => $config->{access_token},<br>
>             token_secret    => $config->{access_token_secret},<br>
>             method          => 'filter',<br>
>             track           => $config->{terms},<br>
>             timeout         => 60,<br>
>             on_error        => sub {<br>
>                                     $done->end;<br>
>                                     delete $process{$key};<br>
>                                     # must do something to re-load this<br>
> stream<br>
>                                     must_reload_this_stream($key);<br>
>                                                                         },<br>
>             on_tweet        => sub { # do something },<br>
>             on_keepalive    => sub { # do something },<br>
>             on_connect      => sub { # do something },<br>
>     );<br>
>   }<br>
><br>
>   sub must_reload_this_stream {<br>
>     my $key = shift;<br>
><br>
>     $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );<br>
>   }<br>
> </code><br>
><br>
> A minha dúvida é como reiniciar o stream que gerou o erro. Antes eu estava<br>
> desviando o fluxo através do $done->send($key), e depois pegava o valor<br>
> enviado pelo sendo em outro ponto. O problema é que o 'send' desvia todo o<br>
> processo do AE, inclusive de quem está trabalhando bem.<br>
><br>
> Então resolvi utilizar o begin/end, conforme sugestão do Stan. Como ficou<br>
> no exemplo acima, então eu apago a chave do hash referente ao evento<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa
</div>