[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