OVH Cloud OVH Cloud

Multi-Threading

11 réponses
Avatar
Arthur
Bonjour,

Voici mon probl=E8me :
- Je souhaite interfacer Perl (5.8.6) avec Php (5.0.4).
- Je dois ex=E9cuter 1000 fois la ligne de commande "php script.php"
- Le temps d'ex=E9cution du script PHP est variable d'un appel =E0
l'autre.
- Je veux lancer 5 scripts PHP simultan=E9ment. D=E8s que l'un des 5 se
termine, un nouveau est lanc=E9.

Auriez-vous un bout de code sous la main qui permette de faire cel=E0 en
Perl ?

Merci d'avance pour vos r=E9ponses, car l=E0 je suis un peu perdu

10 réponses

1 2
Avatar
Denis -esp2008-
Bonjour,

Auriez-vous un bout de code sous la main qui permette de faire celà en
Perl ?


Peut-être que certains en ont un, mais quand même il n'est pas bien
compliqué de faire man perl |grep thread

perlthrtut Perl threads tutorial
perlothrtut Old Perl threads tutorial

En plus pour le premier il y a même une traduction disponible sur
http://perl.enstimac.fr/DocFr/perlthrtut.html

Bonne chance,

--
Denis

Avatar
damien guerin
Sinon, avec des fork, c'est pas possible ??
Je dis ça moi, mais...
Avatar
JacK
Le 25/05/2005 11:05, :
Sinon, avec des fork, c'est pas possible ??
Je dis ça moi, mais...

A condition que l'OS le supporte.


Avatar
Paul Gaborit
À (at) 25 May 2005 01:36:25 -0700,
"Arthur" écrivait (wrote):
Voici mon problème :
- Je souhaite interfacer Perl (5.8.6) avec Php (5.0.4).
- Je dois exécuter 1000 fois la ligne de commande "php script.php"
- Le temps d'exécution du script PHP est variable d'un appel à
l'autre.
- Je veux lancer 5 scripts PHP simultanément. Dès que l'un des 5 se
termine, un nouveau est lancé.

Auriez-vous un bout de code sous la main qui permette de faire celà en
Perl ?


En tous la réponse n'est pas dans le titre : ce n'est pas un cas d'utilisation
de multi-threading !

Une solution serait d'utiliser la module Parallel::Jobs (qui est disponible
sur CPAN).

J'ai bien un exemple de code mais il me faudrait le simplifier car, s'il fait
bien ce que vous souhaitez, il le fait en distributant les tâches sur
plusieurs machines et en traitant tous les cas de plantage avec reprise du
calcul erroné. Si vous n'y arrivez vraiment pas autrement, je prendrai
peut-être le temps de vous le simplifier.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul Gaborit
À (at) Wed, 25 May 2005 12:14:57 +0200,
JacK écrivait (wrote):
Le 25/05/2005 11:05, :
Sinon, avec des fork, c'est pas possible ??
Je dis ça moi, mais...

A condition que l'OS le supporte.



La fonction 'fork' de Perl fonctionne bien évidemment sur tous les OS qui
implémentent 'fork'. Sur d'autres OS (comme Windows par exemple), le 'fork' est
(correctement) émulé via des appels spécifiques.

Il reste quelques OS (Mac OS, AmigaOS, RISC OS, VOS, VM/ESA) où 'fork'
n'existe pas (ni en vrai ni émulé) mais ils sont quand même en voie
d'extinction... ;-)

Pour 'exec', la situation est quasi similaire.

Pour en savoir plus, il faut lire perlport (en anglais pour perl 5.8.5):
<http://perl.enstimac.fr/perl5.8.5/5.8.5/pod/perlport.html>

PS: Attention, la traduction française de perlport accessible via l'URL
ci-dessous n'est vraiment pas à jour en particulier sur 'fork' : il faut dire
que cette traduction date de la version 5.005_02 de perl :-(

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Arthur

Une solution serait d'utiliser la module Parallel::Jobs (qui est disponib le
sur CPAN).


Oui, ça semble être exactement ce que je cherche

J'ai bien un exemple de code mais il me faudrait le simplifier car, s'il fait
bien ce que vous souhaitez, il le fait en distributant les tâches sur
plusieurs machines et en traitant tous les cas de plantage avec reprise du
calcul erroné. Si vous n'y arrivez vraiment pas autrement, je prendrai
peut-être le temps de vous le simplifier.


Ca m'intéresse grandement.
Si vous n'avez pas le temps de simplifier, vous n'êtes pas obligé, je
réussiras bien à isoler le code qui m'intéresse ;)

Merci d'avance

Avatar
Arthur
Il semblerait que Parallel::ForkManager soit mieux adapté pour ce type
de tâche.
Voyez vous des inconvénients dans l'utilisation de cette bibliothèque
(ressource CPU, instabilité ou autres) ?
Avatar
Paul Gaborit
À (at) 26 May 2005 01:37:47 -0700,
"Arthur" écrivait (wrote):
Il semblerait que Parallel::ForkManager soit mieux adapté pour ce type
de tâche.


Exact (je l'avais oublié celui-là). Il est plus simple à mettre en oeuvre que
Parallel::Jobs. Il ne permet pas au processus père de récupérer les sorties
(STDOUT et STDERR) de ses fils... mais dans le cas présent, ça ne semble pas
nécessaire.

Voyez vous des inconvénients dans l'utilisation de cette bibliothèque
(ressource CPU, instabilité ou autres) ?


A priori, pas plus d'inconvénients (sauf bug mais le code est quand même très
simple et semble tout à fait correct) que si on utilise Parallel::Jobs.


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Arthur
Parfait, me voilà rassuré.

Merci pour votre aide
Avatar
DoMinix
Bonjour,

Voici mon problème :
- Je souhaite interfacer Perl (5.8.6) avec Php (5.0.4).
- Je dois exécuter 1000 fois la ligne de commande "php script.php"
- Le temps d'exécution du script PHP est variable d'un appel à
l'autre.
- Je veux lancer 5 scripts PHP simultanément. Dès que l'un des 5 se
termine, un nouveau est lancé.

Auriez-vous un bout de code sous la main qui permette de faire celà en
Perl ?

Merci d'avance pour vos réponses, car là je suis un peu perdu



Merlyn, aka randal schwartz a ecris un article pour faire
exactement cela avec des fork.
http://www.stonehenge.com/merlyn/UnixReview/col41.html

--
dominix

1 2