threads - Perl - Programmation
Marsh Posté le 04-03-2004 à 08:55:52
t'en fait bombien des thread? pasque la t'as fait une boucle infinie
T'es sous windows? si t'es sous linux je te conseil plutot de faire un bon vieux fork, avec Proc::Simple par exemple : la au moins tu sera certain que tes données seront independantes et en plsu tu economisera de la memoire grace au copy on write (les thread sont pas encore bien stable, ca devrait etre mieux avec perl 5.10)
Mais il se peux que la lib utilisée par Net::Ping soit synchronisée, un peu comme les librairies de DNS, et dans ce cas tu peux pas en lancer un sans que le precedent n'ai recu sa reponse..??...
Marsh Posté le 04-03-2004 à 10:37:33
oui oui je sais que c une boucle infinie, c'etait juste pour donner la syntaxe...
yen aura à peu près 200...
je travaille sur windows
mais ca va g trouvé un petit truc, c pas joli joli mais ca fonctionne:
dans chaque thread je fais system "perl ping.pl $ip"
et dans le script je fais appel à la fonction Net::Ping !
ainsi un interpreteur perl est lancé pour chaque thread et ya plus de probleme avec la fonction!
Le probleme c'est que meme si le package Net::Ping était synchronisé, les ping se feraient les uns à la suite des autres et donc ca prendrait autant de temps que sans les threads...
ici g mis un timeout de 400ms donc theoriquement en une dizaine de secondes (400ms * 20ping) tout doit etre fini!
Alors que si je lance les ping en serie ca ferait 400ms*20*200=1600secondes=27minutes... un peu trop à mon gout! ;o)
Marsh Posté le 04-03-2004 à 11:10:22
si tu veut carrement lancé des interpreteurs perl alors tu ferais mieux de faire ca:
for(1..200) {
$ip = shift @IP;
system(1, "perl ping.pl $ip" ); # le '1' en premier argument est un petit truc non documenté poru faire un detatch!
}
mais bon vu le temps que chaque intepreteur va mettre à se lancer je pense pas que tu soit gagnat...
le mieux serait de lancer disont 10 ou 20 intepreteur en leur donnat à chacun une liste de 10 ou 20 IP à pinger à la suite
et le mieux du mieux serait de tout faire en asynchrone avec un seul intepreteur (et sans thread) à l'aide d'un select (mais je sais pas si Net::Ping te donne la main sur ses sockets...)
Marsh Posté le 04-03-2004 à 13:57:24
ben en fait je crois que je vais faire ca en C ou en java ;o)
c'est beaucoup mieux pour la gestion des threads et de la memoire... en fait je dois faire les ping toutes les 5minutes pour faire des stats et ici seulement avec 3hosts à pinger Perl utilise deja 200mo en memoire en quelques heures... et ca ne fait qu'augmenter lol
Marsh Posté le 04-03-2004 à 14:41:05
Pas etonnant si tu lance un interpreteur par ping (et que tu n'est pas sous linux, et donc que tu n'a pas de copy on write)
tu dois faire combien de ^ping toutes les 5 min?
Mettons par exemple que tu doive faire 10 ping toutes les 5 min (= pinger 10 hosts toutes les 5 min)
pourkoi dans ce cas tu les ping pas les un apres les autre en gardant un interval de 5min entre chaque ping au meme host? En 5 min t'as le temps d'en faire des ping, meme sequentiellement...
en plus si tu fait plein de ping en meme temps tes stats risques d'etre faussées
Marsh Posté le 04-03-2004 à 14:49:08
g 200 routeurs à pinger
et je fais 20ping sur chaque routeur pour avoir une moyenne, max, min...
le probleme c'est que les routeurs sont assez dispersés geographiquement donc g des temps de reponses assez elevés! Donc ca pourrait facilement monter à plusieurs minutes pour tt faire sequentiellement ( et je n'en dispose que de 5)
Marsh Posté le 04-03-2004 à 14:52:26
Tu peu utiliser la librairie ping de POE:
http://search.cpan.org/~rcaputo/PO [...] 01/Ping.pm
elle est forcement asynchrone vu que c'est le principe de fonctionnement de POE. Avec ca tu pourra lancer tous tes pings sans probleme, sans thread
par contre il va falloir un peu te former à POE (poe.perl.org), mais ca vaut le coup!!
Marsh Posté le 11-03-2004 à 11:07:12
Alors t'en est ou avec POE?
Je parcourais le site de poe et je suis tombé sur cet exemple dans le cookbook:
http://poe.perl.org/?POE_Cookbook/ [...] iple_Hosts
Marsh Posté le 16-03-2004 à 13:44:26
Ben en fait g pas trop le temps de me lancer la-dedans, vu que je suis en stage et que bon g plein de choses à faire et que c un peu pressant... Donc ici la solution que j'ai adopté c de diminuer le nombre de ping pour les hosts dont on sait qu'ils ont un temps de reponse plus important! Comme ca plus vraiment de probleme de temps! Mais bon je garde le lien au cas où... Merci!
Marsh Posté le 03-03-2004 à 14:34:16
bonjour,
j'ai fait un pt prog pour tester des temps de reponse de routeurs et vu le nombre de ping à faire j'utilise des threads pour lancer 20ping sur chaque routeur...
j'utilise cette syntaxe:
for(;;
{
$thr=threads->new(\&fonction,"$ip" );
$thr->detach;
}
sub fonction{
for($i=0;$i<20;$i++)
{
ping $ip
}
}
si je lance 1 threads tt seul, tout va bien mais j'en lance plusieurs (ce qui est le but) les données sont fausses...
je pense que c'est un probleme au niveau de l'accès à la fonction ping (j'utilise le package Net::Ping) et j'ai l'impression que les processus utilisent les memes variables alors que theoriquement les variables sont instanciées pour chaque processus!
est-ce quelqu'un a deja eu ce probleme? et surtout comment le resoudre?