Perl et le Multitache
Le
Chloe Sival
Bonjour,
Je sollicite une nouvelle fois votre aide pour essayer d'optimiser mon
script perl.
J'ai donc un script qui s'execute normalement, pour le moment, ma
logique est du style :
#!/usr/bin/perl
&action1;
&action2;
&action3;
&traitement
Donc j'execute le sub action1, attends qu'il finisse, execute l'action2,
attends qu'il finisse etc et au final je traite les resultats.
Mon petit soucis est que chaque action prends une dizaine de seconde
et non pas de lien l'une vers l'autre.
Je voudrais "exécuter" simultanément les trois "&actionsX" et que
&traitement s’exécute ensuite quand les trois actions auront fini
leur jobs.
quelqu'un a une idée de comment faire ?
j'ai commencé a lire sur les threads mais pas évident ..
merci d'avance
Chloe
Je sollicite une nouvelle fois votre aide pour essayer d'optimiser mon
script perl.
J'ai donc un script qui s'execute normalement, pour le moment, ma
logique est du style :
#!/usr/bin/perl
&action1;
&action2;
&action3;
&traitement
Donc j'execute le sub action1, attends qu'il finisse, execute l'action2,
attends qu'il finisse etc et au final je traite les resultats.
Mon petit soucis est que chaque action prends une dizaine de seconde
et non pas de lien l'une vers l'autre.
Je voudrais "exécuter" simultanément les trois "&actionsX" et que
&traitement s’exécute ensuite quand les trois actions auront fini
leur jobs.
quelqu'un a une idée de comment faire ?
j'ai commencé a lire sur les threads mais pas évident ..
merci d'avance
Chloe

Poser une question


la syntaxe pour l'appel d'un sub action1 est action1(); , il faut
essayer d'éviter la syntaxe &action1; qui est maintenant obsolète.
(pour référence
https://www.socialtext.net/perl5/su..._ampersand ,
par exemple...)
Pensez-vous réellement que l'execution en parallèle des 3 "actions"
rendrait le code plus performant ??? (pourquoi ?)
A priori si chaque "action" prend 10 secondes, il n'y a pas de raison
que l'execution des 3 actions prenne moins de 30 secondes (à ressources
constantes) qu'on utilise du multithread ou non ... si ???
Cordialement,
azra.
Le 06/01/2012 05:37, Chloe Sival a écrit :
Si les actions sont limitées par la même ressource, oui. Et encore, dans le
cas du CPU, à condition de ne pas avoir entendu parler de CPU multucoeurs.
Si les actions sont limitées par des ressources différentes, genre une le
CPU, l'autre le disque, et deux autres la réactivité réseau de deux sites
distincts, alors non, pas du tout.
Un script simpliste :
#!/usr/bin/perl
use strict;
use warnings;
use threads;
use Time::HiRes qw( time );
# définitions des actions
sub action1 {
print "Début thread 1n";
sleep 10;
print "Fin thread 1n";
}
sub action2 {
print "Début thread 2n";
sleep 8;
print "Fin thread 2n";
}
sub action3 {
print "Début thread 3n";
sleep 12;
print "Fin thread 3n";
}
my $start = time(); # top départ
# création et lancement des threads
my $thread1 = threads->create(&action1);
my $thread2 = threads->create(&action2);
my $thread3 = threads->create(&action3);
# attente que chaque thread se termine (et nettoyage)
$thread1->join;
$thread2->join;
$thread3->join;
my $end = time(); # top d'arrivée
print "time =", $end-$start, "n";
__END__
Sur ma machine, j'obtiens:
Début thread 1
Début thread 2
Début thread 3
Fin thread 2
Fin thread 1
Fin thread 3
time .0276210308075
On voit que le temps d'exécution du script est proche du temps
d'exécution du thread le plus long : c'est toujours comme ça quand on
fait roupiller les threads ;-)
Avec de vraies "actions", c'est beaucoup moins favorable.
Essayez avec vos routines actions et chronométrez pour voir si ça vaut
le coup d'utiliser des threads.
HTH
--
J-L
http://www.bribes.org/perl/
Oui, car le delais n'est pas du aux ressources internes de la machine
qui execute le script mais a la machine distante, hors les trois actions
dialogue avec des machines differentes.
J'ai fais un test simple:
J'ai fait trois script perl, un par action, et je les ai executé en meme
temps via un .sh et cela a bien été traité en moins de 10s
Le 06/01/2012 18:35, Jean-Louis Morel a écrit :