Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1337 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  threads

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

threads

n°662115
chopman
Posté le 03-03-2004 à 14:34:16  profilanswer
 


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?

mood
Publicité
Posté le 03-03-2004 à 14:34:16  profilanswer
 

n°662415
pospos
Posté le 04-03-2004 à 08:55:52  profilanswer
 

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..??...

n°662502
chopman
Posté le 04-03-2004 à 10:37:33  profilanswer
 

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)

n°662548
pospos
Posté le 04-03-2004 à 11:10:22  profilanswer
 

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

n°662804
chopman
Posté le 04-03-2004 à 13:57:24  profilanswer
 

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

n°662906
pospos
Posté le 04-03-2004 à 14:41:05  profilanswer
 

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

n°662926
chopman
Posté le 04-03-2004 à 14:49:08  profilanswer
 

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)

n°662932
pospos
Posté le 04-03-2004 à 14:52:26  profilanswer
 

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!!

n°662938
chopman
Posté le 04-03-2004 à 14:55:50  profilanswer
 

hmmmm vais regarder à ca

n°670598
pospos
Posté le 11-03-2004 à 11:07:12  profilanswer
 

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

mood
Publicité
Posté le 11-03-2004 à 11:07:12  profilanswer
 

n°675010
chopman
Posté le 16-03-2004 à 13:44:26  profilanswer
 

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!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  threads

 

Sujets relatifs
[C] Cherche un tuto pour apprendre à faire des threads en C"unable to initialize threads: cannot find class java/lang/Thread"
[c++] probleme avec le mot clé static et les threads sous windowsproblème avec les threads (associés aux sockets) sous windows
problème avec des threads sous vb.net.lib à inclure pour threads sous VC++
Support des threads dans PHP ?création de threads + sockets asynchrones portable win32/linux
programmation Qt -> threads - GUI[C] Producteur/consommateur avec threads en C sur liste chainée...
Plus de sujets relatifs à : threads


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR