Pergunta

Eu estou correndo de 40 ou-assim threads com o seguinte sub-rotina:

my $app = shift;
my $ua = LWP::UserAgent->new();
$ua->timeout(5);
my $response = $ua->get($$app{'watch_url'});
my $new_md5;
if ($response->is_success()) {
    $new_md5 = md5_hex($response->content());
}
return ($$app{'short_name'}, $$app{'watch_md5'}, $new_md5);

Despejos de memória acontecer cerca de 3/4 do tempo.LWP e LWP::UserAgent são pura Perl, então eu sou pego de surpresa por isso.É LWP::UserAgent não é thread-safe?

Atualização:

Aqui está uma versão minimalista para reproduzir o problema:

use strict;
use warnings;
use threads;
use LWP::UserAgent;

sub check_app {
    my $ua = LWP::UserAgent->new();
    $ua->timeout(5);
    $ua->get('http://www.flatdoc.com/?' . rand(10));
}

my @threads;
for (my $i = 0; $i < 40; $i++) {
    my $thread = threads->create(\&check_app);
    push(@threads, $thread);
}
foreach (@threads) {
    $_->join();
}
Foi útil?

Solução

Non-thread-safe puro-código Perl não causa um segfault (na verdade, nenhum puro código Perl deve causar uma segfault).Um bug no Perl faz com que um segfault.E threads em Perl são historicamente muito buggy, mas eles ficaram muito melhor.

Seu código é executado bem em 5.10.1, e HTTP::Lite provavelmente não agradar qualquer que seja o perl bug que você executar em.Provavelmente você só precisa usar uma versão mais recente do Perl.O mais antigo e mais próximo do Redhat você ficar, menos estável threads.Se você estiver indo para usar threads, use o mais novo Perl que você pode chegar em suas mãos.

Como uma alternativa para segmentos, você pode usar algo como Paralelo::ForkManager, LWP::Paralela ou até mesmo o incrível garfos módulo que emula segmentos usando um garfo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top