Eu trato o SIGTERM, e sim, removi o cv pq não está faz sentido no programa final.
Solli Em 23/02/2013 18:04, "Stanislaw Pusep" <[email protected]> escreveu: > Só uma retificação: seja com ou sem o hook no SIGTERM, o loop *vai* morrer > :) > > > ABS() > > > 2013/2/23 Solli Honorio <[email protected]> > >> 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 >> <[email protected]>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 <[email protected]> >>> >>> > >>> > 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 >> >> =begin disclaimer >> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ >> SaoPaulo-pm mailing list: [email protected] >> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> >> =end disclaimer >> >> > > =begin disclaimer > Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ > SaoPaulo-pm mailing list: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > >
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
