[SP-pm] alarm()

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Janeiro 29 14:14:47 PST 2008


Thomas Britis wrote:
> Senhores,
> Tenho um looping que faz uma busca de informações em alguns sistemas
>  externos. O problema é que as vezes, um desses sistemas trava. Mas,
> a conexão é estabelecida, a informação é solicitada, mas ele não
> entrega a resposta. Esses sistemas são proprietários e já foi aberto
> ticket para solução do problema. Enquanto isso, preciso fazer algo
> para agilizar a captura das informações dos outros sistemas.

Quer dizer: o sistema é uma merda, e você ainda paga por isso... é 
lamentável. (um minuto de silêncio em luto)

[um minuto depois]

> Pensei então em fazer um alarm() dentro do looping e descartar após 
> alguns segundos a busca atual, algo como, só que não consigo fazer um
>  next() usando o $SIG{ALRM}.

Claro que não. :)

> O que eu pensei era algo como:
> 
> for (0..10) {
 >   local $SIG{ARLM} = sub { next; };
 >   alarm 5;
 >   $info = &busca_info ($_);
 >   &processa ($info, $_);
 >   alarm 0;
 > }
> 
> Alguém tem alguma idéia de como fazer isso?

   Eu tenho.

   Faz assim:

   local $SIG{ALARM} = sub { die q{Acorda pra cuspir!}; };
   for ( 0..10 ) { # para que isso?
     alarm $timeout;
     my ( $info );
     eval { processa( busca_info( $_ ), $_ ); };
     if( defined $@ && $@ eq q{Acorda pra cuspir!} ) {
       # teu alarme deu timeout: loga o evento, next.
       log( qq{Time out processando $_.} );
       next;
     }elsif( defined $@ ){
       # deu merda, trata erro
     } # else { # não acho que você precisa disso }
   } # for

   Isso resolve o teu problema, mas CUIDADO: SIG{ALARM} é usado 
intensivamente pelo LWP, e a syscall "alarm()" não é reentrante. Você 
foi avisado!!!

   Putamplexos!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}

PS: Claro que eu não testei o código. ;) Rapadura é doce, mas não é 
mole, meu caro...


Mais detalhes sobre a lista de discussão SaoPaulo-pm