mes threads font ce qu'il veulent ! [Pas tout à fait resolu]

mes threads font ce qu'il veulent ! [Pas tout à fait resolu] - Perl - Programmation

Marsh Posté le 25-11-2004 à 05:13:51    

salut,
 
  j'essaye de pinguer plusieurs sites à la volée donc évidemment j'ai voulu passer par des threads pour aller plus vite.
 
Donc j'ai pris une sub, je lui ais mis le test  

Code :
  1. my $pong = Win32::PingICMP->new('icmp', 2);
  2. if ($pong->ping($site, 1))


et je la thread avec

Code :
  1. @thr[$k] = threads->new(\&sub1, $site);


jusque là tout va bien il me ping bien rapide et me sort aussi les erreurs, la où ca commence à merdouiller c'est quand je lui dis d'écrire en base de donnée, donc j'ai plutôt essayé en fichier texte mais là ca marche quand ca veut pareil pour le getstore de l'url.
 
Ya aussi un autre problême c'est que pour que ca marche, j'ai du lui faire un detach

Code :
  1. @thr[$k]->detach;


donc j'ai plus le contrôle de mes ptits :pt1cable: ce qui m'empêche de décrémenter mon $k et de killer mes threads.
 
en même temps je dois ptêtre mal utiliser mes threads alors si qqun si connait qu'il hésite pas :whistle:


Message édité par bill_clinton le 02-12-2004 à 11:44:40
Reply

Marsh Posté le 25-11-2004 à 05:13:51   

Reply

Marsh Posté le 02-12-2004 à 11:34:31    

en fait j'utilisais mes variables n'importe comment (plus la sortie fichier et db dans le thread ce qui était un peu aléatoire) :
 
par contre j'ai lu un truc sur le web :  

Code :
  1. La chose la plus importante à garder à l'esprit quand on compare les ithreads à d'autres modèles de gestion des threads est le fait que pour chaque thread créé, une copie complète de toutes les variables et données du thread parent doive être faite. La création d'un thread peut donc être coûteuse en termes de mémoire autant que de temps de calcul. La meilleure façon de réduire ces coûts est d'avoir un faible nombre de threads qui vivent longtemps, tous créés assez tôt - avant que le thread de base n'ait accumulé trop de données en mémoire. Bien sûr, après qu'un thread a été créé, ses performances et son occupation mémoire devraient être peu différente que celles de code ordinaire.


 
Ce qui m'amène à l'autre problême -> dans mon cas, je suis bien obligé de créer mes threads dans une boucle, par contre je ne dépasse pas 30 à 35 threads qui tournent en même temps, grâce à mon tableau, je stocke mes threads et dès qu'un à terminé il laisse sa place à quelqu'un d'autre. Ce qu'il y a c'est que ma charge dédié grimpe assez vite, donc qu'en est il, est-ce que ca vient de mes threads ou d'autre chose ?
 
je laisse un bout de code au cas où (pas la peine de me dire que l'algo est bidon, je le sais déjà) :
 

Code :
  1. open fich_ping, ">>liste_sites_ping.txt";
  2. open fich, "<liste.txt";
  3. $marche = 0; $ok = 0; $k = 0;
  4. my @thr_valeur : shared;
  5. my @thr_sites : shared;
  6. $pong = Win32::PingICMP->new('icmp', 2);
  7. #*************************************************************************************************
  8. #**************** Thread de ping, partage les tableaux @thr_valeur et @thr_sites *****************
  9. sub sub1()
  10. {my $site_ping = "www.".@_[0].".com";
  11. my $num = @_[1];
  12. if ($pong->ping($site_ping, 1))
  13. {@thr_valeur[$num] = 1;
  14.   print "$num -- @_[0] ----- en attente.\n";}
  15. else {@thr_valeur[$num] = 2;}}
  16. #************* Fin de thread de ping, partage les tableaux @thr_valeur et @thr_sites *************
  17. #*************************************************************************************************
  18. sub log_et_store(;$$$)
  19. {print fich_ping "$_[0]\n";  getstore($_[1], $_[2]);}
  20. while(<fich> )
  21. {chomp;
  22. if (/$ARGV[0]/) {$ok = 1;}
  23. if ($ok == 1)
  24. {$k++;  $site = "www.".$_.".com";
  25.   @thr_valeur[$k] = 0;
  26.   $deja_pinge = 0;
  27.   for ($i = 1; $i <= $k; $i++)
  28.   {if (@thr_valeur[$i] > 0)
  29.   {if (@thr_valeur[$i] == 1)
  30.    {log_et_store(@thr_sites[$i], "http://www.".@thr_sites[$i].".com", @thr_sites[$i].".html" );
  31.     print $i." -- @thr_sites[$i] ----- pris pour $k\n";  @thr_valeur[$i] = 3;  @thr_sites[$i] = "";}
  32.     if (@thr_valeur[$i] == 2)
  33.    {print $i." -- @thr_sites[$i] ----- perdu pour $k\n";  @thr_valeur[$i] = 3;  @thr_sites[$i] = "";}
  34.     @thr[$i] = 0;
  35.    if ($deja_pinge == 0)
  36.    {@thr_valeur[$i] = 0;  @thr_sites[$i] = $_;
  37.     @thr[$i] = threads->new(\&sub1, $_, $i);  @thr[$i]->detach;
  38.     print ".................................".$i." -- ping $_ pour $i\n"; $deja_pinge = 1; $k--;}
  39.   }
  40.  }
  41.   if ($deja_pinge == 0)
  42.  {@thr[$k] = threads->new(\&sub1, $_, $k);  @thr[$k]->detach;
  43.   @thr_valeur[$k] = 0;  @thr_sites[$k] = $_;
  44.   print "....................................................".$i." -- ping $_ pour $k\n";}
  45. }}
  46. $pong->close();
  47. #$db->Close();
  48. close fich;
  49. close fich_ping;


 
fich --> c'est le fichier qui contient les sites à pinguer
fich_ping --> qui contient les sites ayant passé le test
@thr_valeur --> l'état du site à pinguer (0-en cours, 1-réussi, 2-rejeté, 3-prêt à être remplacé)
@thr_sites --> le nom du site (sans "http://www." ni ".com" )
@thr --> le tableau des threads


Message édité par bill_clinton le 02-12-2004 à 11:44:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed