Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Perl et le Multitache

8 réponses
Avatar
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

8 réponses

Avatar
azrazer
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
Avatar
Nicolas George
azrazer , dans le message <je6eq6$449$, 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.
Avatar
Jean-Louis Morel
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 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/
Avatar
Chloe Sival
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



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.
Avatar
Chloe Sival
Merci beaucoup je vais essayer

Le 06/01/2012 18:35, Jean-Louis Morel a écrit :
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 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/
Avatar
azrazer
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.
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

Avatar
Chloe Sival
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 :
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 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/
Avatar
espie
In article <4f0b4867$0$30736$,
Chloe Sival 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.