Question

Je cours 40-ou-so fils avec le sous-programme suivant:

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

décharges de base ensuivre environ 3/4 du temps. LWP et LWP :: UserAgent sont pures Perl, donc je suis pris au dépourvu par cela. LWP :: UserAgent pas thread-safe?

Mise à jour:

Voici une version minimale de reproduire le problème:

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();
}
Était-ce utile?

La solution

Non-thread-safe-pur code Perl ne provoque pas une erreur de segmentation (en fait, pas de code pur Perl doit provoquer une erreur de segmentation). Un bogue dans Perl provoque une erreur de segmentation. Et les discussions en Perl sont historiquement très bogué, mais ils ont obtenu beaucoup mieux.

Votre code fonctionne bien en 5.10.1 et HTTP :: Lite ne probablement pas chatouiller tout bug que vous avez perl rencontrer. Probablement que vous avez juste besoin d'utiliser une version plus récente de Perl. Le plus ancien et plus proche de vous Redhat obtenir, les fils sont moins stables. Si vous allez utiliser les threads, utilisez le nouveau Perl vous pouvez obtenir vos mains sur.

Comme alternative à threads, vous pouvez utiliser quelque chose comme parallèle :: ForkManager , LWP :: parallèle ou même l'incroyable Module fourches qui émule les sujets utilisant la fourchette.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top