Domanda

Sono in esecuzione 40-o-così le discussioni con la seguente subroutine:

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);

I core dump derivarne circa 3/4 del tempo. LWP e LWP :: UserAgent sono puri Perl, quindi sono presi alla sprovvista da questo. È LWP :: UserAgent non thread-safe?

Aggiornamento:

Ecco una versione minima di riprodurre il 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();
}
È stato utile?

Soluzione

Non thread-safe codice puro-Perl non causa un segfault (in realtà, nessun codice Perl puro dovrebbe causare un segfault). Un bug in Perl provoca un segfault. E le discussioni in Perl sono storicamente molto buggy, ma hanno ottenuto molto meglio.

Il codice viene eseguito bene in 5.10.1, e HTTP :: Lite probabilmente solo non solleticare qualsiasi bug Perl hai incontrato. Probabilmente hai solo bisogno di usare una nuova versione di Perl. Il più vecchio e più vicino alla RedHat si ottiene, i fili meno stabili sono. Se avete intenzione di utilizzare i thread, utilizzare il nuovo Perl è possibile mettere le mani su.

In alternativa alle discussioni, si può usare qualcosa di simile a Parallel :: ForkManager , LWP :: parallela o anche la sorprendente forcelle modulo che emula fili utilizzando fork.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top