[Squeak-fr] Re: Eclaircissement : Exécution parallèle de plusieurs objets

Noury Bouraqadi bouraqadi at ensm-douai.fr
Jeu 28 Avr 17:51:05 CEST 2005


Le 28 avr. 05, à 10:08, BELEM Mahamadou a écrit :

> Je reviens encore sur le sujet de parallélisme. Si j'ai bien compris 
> votre exemple, les blocs "Saluts", "Hello" et "Coucou" s'exécutent en 
> parallèle.
>  
> Ce que j'envisage de faire c'est d'exécuter plusieurs objets 
> simultanément. J'ai plusieurs objets dont le nombre peut augementer ou 
> diminuer pendant l'exécution du programme. Ces objets, je les ai dans 
> une liste sous forme de collection. Je ne veux pas les traiter 
> séquentiellement en faisant par exemple :
>  maCollection do: [:a| a optimiser].
>
Pourquoi pas
maCollection do: [:a| [a optimiser] fork] ? (Ne pas oublier d'insérer 
des Processor yield dans "optimiser".

> la fonction optimiser fait appel à un autre porgramme qui est sous 
> Gams. Donc tous les objets accèdent au même programme pour l'exécution 
> à partir de la méthode "optimiser".
>
> Je m'explique : voici le corps du programme principal
>
> stepD1G: t // le temps d'éxécution courant
>  | collec |
>  self thePR_Cells do: [:a | a status: #notRent].
>  self create1Group.
>  collec := Cormas mixt: self thePR_Farmers. //mes objets
>  [collec do: [:f |f optimiser.]]fork .
>
>  collec do: [:f | f initialCalls].
>  collec do: [:f | f proposals].
>  collec do: [:f | f finalAnswers].
>  collec do: [:f | f update].
>
> voici le corps de optimiser de la classe PR_Farmers:
>
> PR_Farmers optimiser
>         WinProcess cshOne: 'Gams D:\Belem\Modele\plantsAcess1.gms'.
>
> Si je lance mon programme pour 10 pas d'éxécution, tout le corps du 
> programme s'exécute normalement pour chaque pas de temps, mais le bock 
> Fork s'éxécute à la fin du programme pour tous les 10 pas de temps (au 
> même moment) ce qui est anormal.
Non, c'est normal. Frok crée un process de la même priorité que celui 
qui tourne. Et Smalltalk exécute un process tant qu'il ne s'arrête pas 
ou se suspend ou donne lui même la main (ou encore pas préempté). Donc, 
si tu veux que ton fork prenne la main, il faut insérer juste après un 
Process yield.

Pour comprendre exécute ces 2 bouts de code dans un workspace.
-----------------------------------------------------------
Code 1
-----------------------------------------------------------
|lock|
Transcript clear.
lock := Semaphore forMutualExclusion.
[5 timesRepeat: [
lock critical: [Transcript cr; show: 'Fork'].]] fork.
5 timesRepeat: [
lock critical: [Transcript cr; show: 'Courant'].]

-----------------------------------------------------------
Code 2
-----------------------------------------------------------
|lock|
Transcript clear.
lock := Semaphore forMutualExclusion.
[5 timesRepeat: [
lock critical: [Transcript cr; show: 'Fork'].
Processor yield]] fork.
5 timesRepeat: [
lock critical: [Transcript cr; show: 'Courant'].
Processor yield]
-----------------------------------------------------------

Dans le code 1 le proess courant termine son exécution (5 affichages de 
Courant) puis le Fork prend la main.  Dans le code 2, Fork et Courant 
sont affichés à tour de rôle. La différence est dans le Processor 
yield.

>
> Mon souci est comment exécuter simultanément mes n objets pour chaque 
> pas de temps sans rencontrer le problème expliqué.
>
> Bien à vous
>
> BELEM Mahamadou
>
>
>  
>
>
>
> Noury Bouraqadi <bouraqadi at ensm-douai.fr> wrote:
> Il faut pas oublier des Processor yield pourqu'ils se passent la main.
> Pour avoir une idée, exécute ce bout de code dans un workspace.
> Chacun des 3 process affichera son message à tour de rôle sur le
> Transcript.
>
> |lock|
> Transcript clear.
> lock := Semaphore forMutualExclusion.
> [5 timesRepeat: [
> lock critical: [Transcript cr; show: 'Salut'].
> Processor yield]] fork.
> [5 timesRepeat: [
> lock critical: [Transcript cr; show: 'Hello'].
> Processor yield]] fork.
> [5 timesRepeat: [
> lock critical: [Transcript cr; show: 'Coucou'].
> Processor yield]] fork.
>
> Le lock ici sert uniquement pour gérer la concurrence d'accès au
>  Transcript.
>
> Noury
>
> Le 27 avr. 05, à 16:30, Romain Robbes a écrit :
>
> >>>
> >>> A côté j'ai un autre modèle fait sous Gams (programmation
>  >>> mathématique),
> >>> chaque objet doit exécuter le modèle par une méthode que j'appelle
> >>> "optimiser".
> >>> J'ai considéré au départ les objets comme une collection :
> >>>
> >>> ...
> >>> [collec do: [:each| each optimiser]] fork.
> >>> ...
> >
> > collec do: [:each | [each optimiser] fork].
> >
> > peut-être ?
> >
> > Romain_______________________________________________
> > Squeak-fr mailing list
> > Squeak-fr at lists.squeakfoundation.org
> > http://lists.squeakfoundation.org/listinfo/squeak-fr
> >
> >
> >
> --------------------------------------------------------------
> Dr. Noury Bouraqadi - Enseignant/Chercheur
> Ecole des Minees de Douai - Dept. G.I.P
> http://csl.ensm-douai.fr/noury
>
> European Smalltalk Users Group Board
> http://www.esug.org
>
> Squeak: an Open Source Smalltalk
> http://www.squeak.org
> --------------------------------------------------------------
>
>
>
>  Découvrez le nouveau Yahoo! Mail : 250 Mo d'espace de stockage pour 
> vos mails !
> Créez votre Yahoo! Mail
--------------------------------------------------------------
Dr. Noury Bouraqadi - Enseignant/Chercheur
Ecole des Mines de Douai - Dept. G.I.P
http://csl.ensm-douai.fr/noury

European Smalltalk Users Group Board
http://www.esug.org

Squeak: an Open Source Smalltalk
http://www.squeak.org
--------------------------------------------------------------




Plus d'informations sur la liste de diffusion Squeak-fr