Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Perl et le Multitache

10 views
Skip to first unread message

Chloe Sival

unread,
Jan 5, 2012, 11:37:19 PM1/5/12
to
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

azrazer

unread,
Jan 6, 2012, 4:27:35 AM1/6/12
to
Bonjour,
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/subroutines_called_with_the_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 :
> 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

Nicolas George

unread,
Jan 6, 2012, 7:24:48 AM1/6/12
to
azrazer , dans le message <je6eq6$449$1...@speranza.aioe.org>, a écrit :
> 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 ???

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.

Jean-Louis Morel

unread,
Jan 6, 2012, 12:35:16 PM1/6/12
to
Le 06/01/2012 05:37, Chloe Sival a écrit :
> J'ai donc un script qui s'execute normalement, pour le moment, ma
> logique est du style :
>
> #!/usr/bin/perl
>
> &action1;
> &action2;
> &action3;
> &traitement
>
> Je voudrais "exécuter" simultanément les trois "&actionsX" et que
> &traitement s’exécute ensuite quand les trois actions auront fini
> leur jobs.
>

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 1\n";
sleep 10;
print "Fin thread 1\n";
}

sub action2 {
print "Début thread 2\n";
sleep 8;
print "Fin thread 2\n";
}

sub action3 {
print "Début thread 3\n";
sleep 12;
print "Fin thread 3\n";
}

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 =12.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/

Chloe Sival

unread,
Jan 8, 2012, 2:44:36 AM1/8/12
to
Le 06/01/2012 10:27, azrazer a écrit :
> Bonjour,
> 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/subroutines_called_with_the_ampersand ,
> par exemple...)
>
> Pensez-vous réellement que l'execution en parallèle des 3 "actions"
> rendrait le code plus performant ??? (pourquoi ?)


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

Chloe Sival

unread,
Jan 8, 2012, 2:48:16 AM1/8/12
to

Merci beaucoup je vais essayer

azrazer

unread,
Jan 9, 2012, 4:29:05 AM1/9/12
to
Bonjour,
D'accord, dans ce cas là [:
(je pensais le problème simple se réduisant à l'execution d'un script
sur une machine isolée)
désolé.
azrA.

Chloe Sival

unread,
Jan 9, 2012, 3:04:46 PM1/9/12
to


Bon ba a premiere vu cela n'apporte rien, au contraire cela allonge de
10 secondes ..

c'est etonnant car en executant en meme temps deux sub cela mets plus de
temps que de les lancer l'un apres l autre alors que les ressources
machines sont largement sous exploité

snifff



Le 06/01/2012 18:35, Jean-Louis Morel a écrit :

Marc Espie

unread,
Jan 9, 2012, 4:13:33 PM1/9/12
to
In article <4f0b4867$0$30736$426a...@news.free.fr>,
Chloe Sival <chloe...@gmail.com> wrote:
>
>
>Bon ba a premiere vu cela n'apporte rien, au contraire cela allonge de
>10 secondes ..
>
>c'est etonnant car en executant en meme temps deux sub cela mets plus de
>temps que de les lancer l'un apres l autre alors que les ressources
>machines sont largement sous exploité
>
>snifff
>
Es-tu sure d'avoir des "vrais" threads sur ton systeme, et que tes
trois actions s'executent reellement en meme temps ?

essaie sur un truc plus simple pour verifier que tu as bien du
parallelisme.
0 new messages