[SP-pm] Duvida em fluxo de controle com o AnyEvent

Solli Honorio shonorio at gmail.com
Fri Feb 22 13:22:50 PST 2013


Estou com um sistema que abre vários stream no twitter e fica processando
cada retorno, para isto estou utilizando o AnyEvent::Twitter::Stream.

Uma versão simplificada do meu código é assim :

<code>
  use common::sense;
  use AnyEvent;
  use AnyEvent::Twitter::Stream;

  # Definição de variáveis globais
  my %process
  my %CONFIG = load_from_database_my_configuration();

  my $done = AnyEvent->condvar;

  for my $key ( keys %CONFIG ) {
    $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );
  }

  # running


  sub create_twitter_stream {
    my ($key, $config) = @_;

    # cria uma transação para este stream
    $done->begin;

    return AnyEvent::Twitter::Stream->new(
            consumer_secret => $config->{consumer_secret},
            consumer_key    => $config->{consumer_key},
            token           => $config->{access_token},
            token_secret    => $config->{access_token_secret},
            method          => 'filter',
            track           => $config->{terms},
            timeout         => 60,
            on_error        => sub {
                                    $done->end;
                                    delete $process{$key};
                                    # must do something to re-load this
stream
                                    must_reload_this_stream($key);
                                                                        },
            on_tweet        => sub { # do something },
            on_keepalive    => sub { # do something },
            on_connect      => sub { # do something },
    );
  }

  sub must_reload_this_stream {
    my $key = shift;

    $process{$key}{twitter} = create_twitter_stream( $key, $CONFIG{$key} );
  }
</code>

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.

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.

Da maneira como estou fazendo tem risco de criar um memory leak ? Stan,
estou fazendo da maneira correta pensando em AE ?

Obrigado,

Solli Honorio

-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130222/4fdacb68/attachment.html>


More information about the SaoPaulo-pm mailing list