[SP-pm] Duvida em fluxo de controle com o AnyEvent
Solli Honorio
shonorio at gmail.com
Sat Feb 23 11:31:25 PST 2013
Bom,
Ótimo, não tinha pensando no 'send' no SIGTERM, mas realmente faz sentido e
evita eu criar uma tratamento especial para este cara.
Obrigado,
Solli Honorio
Em 23 de fevereiro de 2013 11:35, Stanislaw Pusep <creaktive em gmail.com>escreveu:
> 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...)
> 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).
> Agora, um servidor HTTP seria um contra-exemplo: os requests não dependem
> um do outro (sorry, Microsoft).
> 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.
> Já os guards dos streams, você está fazendo isso certo. Mantenha-os num
> hash e apague-os conforme perecem.
>
> 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 :)
>
>
> ABS()
>
>
> 2013/2/22 Solli Honorio <shonorio em gmail.com>
>
> >
> > 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
>
--
"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/20130223/dedd96a9/attachment.html>
More information about the SaoPaulo-pm
mailing list