<div dir="ltr"><div><br></div><div style>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 style><br></div><div style>
Uma versão simplificada do meu código é assim :</div><div style><br></div><div style><code></div><div style><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 style><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 style><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 style><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 style><font face="courier new, monospace"><br></font></div><div style><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 style><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 style><span style="font-family:'courier new',monospace"> # running</span><font face="courier new, monospace"><br></font></div><div style><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 style> 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 style> sub must_reload_this_stream {</div>
<div style> my $key = shift;</div><div style><br></div><div style> $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );</div></font><font face="courier new, monospace"><div style> }</div></font></div>
</div></div><div style></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<br clear="all"><div><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa
</div></div>