<div dir="ltr">Quanto aos leaks: existe um módulo especialmente voltado para detecção de leaks em aplicativos feitos com AnyEvent, Devel::Leak::Cb (nunca cheguei a usar; mas, em todo caso...)<div style>Me corrija se eu estiver errado, mas o seu aplicativo é uma espécie de um daemon, que só pára quando mandarem parar, correto? Se for o caso, conditional variables se tornam irrelevantes. O propósito dos AnyEvent->condvar é criar "checkpoints". Isso é, sincronizar o que é assíncrono. Isso somente se faz necessário quando existe interdependência de dois (ou mais) fluxos. Exemplo: você dispara ping para vários hosts e reporta o de menor latência ("checkpoint": todos precisam retornar ou dar timeout). Outro exemplo: baixar uma fila de N URLs em paralelo, sem exceder K conexões simultâneas ("checkpoint" periódico: verificar se K == conexões ativas e tomar providências).</div>

<div style>Agora, um servidor HTTP seria um contra-exemplo: os requests não dependem um do outro (sorry, Microsoft).</div><div style>Resumindo a história: você pode muito bem criar um único $cv = AnyEvent->condvar; e depois de inicializar todos os callbacks, dar um único $cv->recv. E o único cara que enviará o $cv->send será um hook no SIGTERM.</div>

<div style>Já os guards dos streams, você está fazendo isso certo. Mantenha-os num hash e apague-os conforme perecem.</div><div style><br></div><div style>P.S. - assumi várias coisas idiossincráticas para mim aqui; não que seja a melhor forma para resolver o seu problema, mas é por onde eu começaria :)</div>

</div><div class="gmail_extra"><br clear="all"><div><br>ABS()<br></div>
<br><br><div class="gmail_quote">2013/2/22 Solli Honorio <span dir="ltr"><<a href="mailto:shonorio@gmail.com" target="_blank">shonorio@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div><br></div><div>Estou com um sistema que abre vários stream no twitter e fica processando cada retorno, para isto estou utilizando o AnyEvent::Twitter::Stream.</div><div><br></div><div>

Uma versão simplificada do meu código é assim :</div><div><br></div><div><code></div><div><div><font face="courier new, monospace">  use common::sense;</font></div><div><div><font face="courier new, monospace">  use AnyEvent;</font></div>



</div><div><div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">use AnyEvent::Twitter::Stream;</font></div>



</div><div><font face="courier new, monospace"><br></font></div><div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"># Definição de variáveis globais</font></div>



<div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">my %process</font></div><div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">my %CONFIG = load_from_database_my_configuration();</font></div>



<div><font face="courier new, monospace"><br></font></div><div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">my $done = AnyEvent->condvar;<br>



</font></div><div><div><font face="courier new, monospace"><br></font></div><div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">for my $key ( keys %CONFIG ) {</font></div>



<div><font face="courier new, monospace">    $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );</font></div><div><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">}</font></div>



<div><font face="courier new, monospace"><br></font></div><div><span style="font-family:'courier new',monospace">  # running</span><font face="courier new, monospace"><br></font></div><div><br></div><div>

<font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><div>  sub create_twitter_stream {</div><div>    my ($key, $config) = @_;</div><div><br></div><div>    # cria uma transação para este stream</div>



<div>    $done->begin;</div><div><br></div><div>    return AnyEvent::Twitter::Stream->new(</div><div>            consumer_secret => $config->{consumer_secret},</div><div>            consumer_key    => $config->{consumer_key},</div>



<div>            token           => $config->{access_token},</div><div>            token_secret    => $config->{access_token_secret},</div><div>            method          => 'filter',</div><div>            track           => $config->{terms},</div>



<div>            timeout         => 60,</div><div>            on_error        => sub {</div><div>                                    $done->end;<br></div><div>                                    delete $process{$key};</div>



<div>                                    # must do something to re-load this stream</div><div>                                    must_reload_this_stream($key);<br></div></font><font face="courier new, monospace"><div>

                                                                        },</div><div>            on_tweet        => sub { # do something },</div><div>            on_keepalive    => sub { # do something },</div><div>



            on_connect      => sub { # do something },</div></font><font face="courier new, monospace"><div>    );</div></font><font face="courier new, monospace"><div>  }</div><div><br></div><div>  sub must_reload_this_stream {</div>



<div>    my $key = shift;</div><div><br></div><div>    $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );</div></font><font face="courier new, monospace"><div>  }</div></font></div>

</div></div><div></code></div><div><br></div>A minha dúvida é como reiniciar o stream que gerou o erro. Antes eu estava desviando o fluxo através do $done->send($key), e depois pegava o valor enviado pelo sendo em outro ponto. O problema é que o 'send' desvia todo o processo do AE, inclusive de quem está trabalhando bem.<div>



<br></div><div>Então resolvi utilizar o begin/end, conforme sugestão do Stan. Como ficou no exemplo acima, então eu apago a chave do hash referente ao evento.</div><div><br></div><div>Da maneira como estou fazendo tem risco de criar um memory leak ? Stan, estou fazendo da maneira correta pensando em AE ?</div>



<div><br></div><div>Obrigado,</div><div><br></div><div>Solli Honorio<span class="HOEnZb"><font color="#888888"><br clear="all"><div><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa
</font></span></div></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div>