En regardant de plus pres ton histoire de Array_Unique, tu galeres parce que tu as choisi le mauvais outil. Au lieu d'utiliser un array, utilise un hash a la place, et le probleme n'existe plus.
Quand tu recuperes les links d'une page, tu les mets dans le hash. Attention, on doit verifier que le link n'est y psa deja, sinon deux pages qu'on spider qui pointe sur une troisieme page serait suffisant pour qu'on considere qu'on la deja vu :
Code:
my %vu;
...
exists $vu{$_} or $vu{$_} = 1 for @startlinks;
Ensuite, on choisi un link a partir du hash %vu qui vaut 1 (donc :qu'on vient d'inserer), et une fois qu'on le prend pour visiter, on l'incremente, qui aura comme objet d'eviter de le prendre une deuxieme fois
Code:
my $nbre_visite;
do {
$nbr_visite = 0;
while( my $start = each %vu ) {
if $vu{$start} == 1 ) {
++$vu{$start};
++$nbre_visite;
visite($start);
}
}
} while $nbre_visite > 0;
Si on a visite au moins un link dans la liste, on reboucle pour respiderer quelque chose d'autre. Si on ne visite rien, alors on a tout visite et on sort
Dans ce context, tu n'as qu'a partager %vu entre tes threads, et tu crees floppee de threads sur la routine visite()
Remarque : c'est un peu con de spiderer des images : tu ne vas pas y trouver de liens vers d'autres pages...
Partager