“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 204 — #214
i
i
i
i
i
i
i
i
204
4
• La programmation concurrente dataflow
variable dataflow, les consommateurs liront le flot au fur et à mesure de sa création.
Le programme suivant crée de façon asynchrone un flot d’entiers et les additionne :
fun {Generate N Limit}
if N else nil end
end
fun {Sum Xs A}
case Xs of X|Xr then {Sum Xr A+X}
[] nil then A end
end
local Xs S in
thread Xs={Generate 0 150000} end % Fil producteur
thread S={Sum Xs 0} end
% Fil consommateur
{Browse S}
end
La figure 4.9 montre une façon particulièrement jolie de présenter cette technique avec
une notation graphique précise. Chaque rectangle représente une fonction récursive
dans un fil, la flèche représente un flot et la direction de la flèche va du producteur
au consommateur. À la fin du calcul, la somme 11249925000 est affichée. Le
producteur, Generate, et le consommateur, Sum, s’exécutent dans leurs propres
fils. Ils communiquent par la variable partagée Xs, qui est liée à un flot d’entiers.
L’instruction case dans Sum bloque quand Xs est non liée (plus d’éléments) et
reprend quand Xs est liée (de nouveaux éléments arrivent).
Xs=0|1|2|3|4|5|...
S={Sum Xs 0}
Xs={Generate 0 150000}
Consommateur
Producteur
Figure 4.9 La communication par flot producteur/consommateur.
Dans le consommateur, le comportement dataflow de l’instruction case bloque
l’exécution jusqu’à l’arrivée de l’élément suivant du flot. Cela synchronise le consommateur avec le producteur. Attendre le lien d’une variable dataflow est le mécanisme de
base pour la synchronisation et la communication dans le modèle concurrent dataflow.
Précédent

- 219/370

Suivant