2009-12-03 3 views
2

J'en 40 ou donc les threads avec la sous-routine suivante:Est-ce que LWP :: UserAgent n'est pas compatible avec les threads?

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 de purs Perl, donc je suis pris au dépourvu. LWP :: UserAgent n'est-il 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(); 
} 
+0

Je voudrais vérifier Digest :: MD5. Chaque fois que je l'utilise je finis par l'emballer dans un eval. –

+0

J'ai testé le script sans cela et je me suis retrouvé avec les core dumps au même rythme. –

+0

Vous n'utilisez pas Thread :: Pool pour vos discussions êtes-vous? Il semble y avoir un accord sur le fait que ce module peut causer des problèmes. –

Répondre

4

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 bug dans Perl provoque un segfault. Et les threads dans Perl sont historiquement très buggés, mais ils se sont beaucoup améliorés.

Votre code fonctionne très bien dans la version 5.10.1, et HTTP :: Lite n'a probablement aucun effet sur les bugs que vous avez rencontrés. Vous avez probablement besoin d'utiliser une version plus récente de Perl. Le plus vieux et plus proche de Redhat vous obtenez, les fils les moins stables sont. Si vous allez utiliser des threads, utilisez le dernier Perl que vous pouvez mettre la main sur. En tant qu'alternative aux threads, vous pouvez utiliser quelque chose comme Parallel::ForkManager, LWP::Parallel ou même le module étonnant forks qui émule les threads à l'aide d'une fourche.

+0

Qu'en est-il de Redhat rend les threads buggy? C'est vrai que je travaille sur des boîtes CentOS. –

+0

Ils sont connus pour patcher Perl, en lançant des patchs expérimentaux dans des versions stables, gâcher des choses et ne pas publier un correctif. Il est devenu particulièrement mauvais au début des années 5,8 quand ils ont cassé Unicode assez dur et ensuite mis la valeur par défaut à UTF-8. Les choses se sont peut-être améliorées, je me méfie de tout RPM Perl. – Schwern

Questions connexes