Je suis en train de créer un programme qui catégorise les numéros d'identification en salles et groupes. Je suis en train de commander une sortie de plusieurs processus parallèles, mais la sortie est venue comme çaCommander des données à partir de plusieurs processus dans Erlang
{'C003','Group A',1}
{'C002','Group B',3}
{'C015','Group C',5}
{'C016','Group D',7}
{'C003','Group A',2}
{'C002','Group B',4}
{'C015','Group C',6}
{'C016','Group D',8}
Mais je veux comme ceci:
{'C003','Group A',1}
{'C003','Group A',2}
{'C002','Group B',3}
{'C002','Group B',4}
{'C015','Group C',5}
{'C015','Group C',6}
{'C016','Group D',7}
{'C016','Group D',8}
Je pensais que je pourrais peut-être envoyer le Numéros à un processus et en quelque sorte les imprimer et leurs groupes dans l'ordre, mais je ne suis pas sûr de savoir comment le faire tout en ayant les processus se déroulent en parallèle. Je pensais qu'une solution pouvait être sélective mais je n'arrive pas à la comprendre non plus. Quelqu'un peut-il m'aider avec cela? Ceci est un extrait de code de mon programme principal Note: Je suis nouveau à Erlang
-module(ppp).
-compile([export_all]).
categorise(L) ->
Size = len(L) div 4,
Rem = len(L) rem 4,
spawn(ppp, cat, [self(), 'Group A', L, 0, Size + Rem]),
spawn(ppp, cat, [self(), 'Group B', L, (Size + Rem), Size]),
spawn(ppp, cat, [self(), 'Group C', L, (2*Size + Rem), Size]),
spawn(ppp, cat, [self(), 'Group D', L, (3*Size + Rem), Size]),
wait(4).
wait(0) -> {done};
wait(N) ->
receive
done -> wait(N-1)
end.
cat(P, Name, L, Start, Elements) ->
Extract = lists:split(Start, L),
Group = element(2, Extract),
AGroup = lists:sublist(Group, Elements),
spawn(ppp, putInRoom, [P, Name, AGroup]).
putInRoom(P, _, []) -> P ! done;
putInRoom(P, GroupName, [H|T]) ->
if GroupName == 'Group A' ->
io:format("~w~n", [{'C003', GroupName, H}]),
putInRoom(P, GroupName, T);
GroupName == 'Group B' ->
io:format("~w~n", [{'C002', GroupName, H}]),
putInRoom(P, GroupName, T);
GroupName == 'Group C' ->
io:format("~w~n", [{'C015', GroupName, H}]),
putInRoom(P, GroupName, T);
GroupName == 'Group D' ->
io:format("~w~n", [{'C016', GroupName, H}]),
putInRoom(P, GroupName, T)
end.
len(L) ->
count(L, 0).
count([], Acc) -> Acc;
count([_|T], Acc) -> count(T, Acc + 1).
Cela n'a rien à voir avec le parallélisme et tout ce qui concerne la concurrence. Le problème est la synchronisation puisqu'il n'y en a pas entre les processus. Vous devez synchroniser la sortie d'une manière ou d'une autre. L'utilisation de sleep ne fonctionne pas lorsque vous êtes très chargé. –
Donc la réponse donnée par Kadaj est correcte car il a suggéré de reproduire ces processus de manière synchrone –