【发布时间】:2014-04-20 19:13:53
【问题描述】:
我正在制作一个程序,将 ID 号分类为房间和组。我正在尝试从多个并行进程中订购一些输出,但输出是这样的
{'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}
但我想要这样:
{'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}
我想也许我可以将这些数字发送到一个进程并让它以某种方式按顺序打印它们和它们的组,但我不确定如何在进程并行发生的同时执行此操作。我认为一个解决方案可能是选择性接收,但我似乎也无法弄清楚。任何人都可以帮助我吗? 这是我的主程序中的一个 sn-p 代码 注意:我是 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).
【问题讨论】:
-
这与并行无关,与并发有关。问题是同步,因为进程之间没有同步。您需要以某种方式同步输出。当你负载很高时,使用睡眠将不起作用。
-
所以Kadaj给出的答案是正确的,因为他建议同步产生这些进程
标签: concurrency parallel-processing erlang multicore