【发布时间】:2012-09-15 11:05:43
【问题描述】:
我在erlang.org course做这个练习:
2) 编写一个启动 N 的函数 在一个环中处理,并发送一个 消息 M 次围绕所有 环中的过程。之后 消息已发送进程 应该优雅地终止。
这是我想出的:
-module(ring).
-export([start/2, node/2]).
node(NodeNumber, NumberOfNodes) ->
NextNodeNumber = (NodeNumber + 1) rem NumberOfNodes,
NextNodeName = node_name(NextNodeNumber),
receive
CircuitNumber ->
io:format("Node ~p Circuit ~p~n", [NodeNumber, CircuitNumber]),
LastNode = NodeNumber =:= NumberOfNodes - 1,
NextCircuitNumber = case LastNode of
true ->
CircuitNumber - 1;
false ->
CircuitNumber
end,
if
NextCircuitNumber > 0 ->
NextNodeName ! NextCircuitNumber;
true ->
ok
end,
if
CircuitNumber > 1 ->
node(NodeNumber, NumberOfNodes);
true ->
ok
end
end.
start(NumberOfNodes, NumberOfCircuits) ->
lists:foreach(fun(NodeNumber) ->
register(node_name(NodeNumber),
spawn(ring, node, [NodeNumber, NumberOfNodes]))
end,
lists:seq(0, NumberOfNodes - 1)),
node_name(0) ! NumberOfCircuits,
ok.
node_name(NodeNumber) ->
list_to_atom(lists:flatten(io_lib:format("node~w", [NodeNumber]))).
这是它的输出:
17> ring:start(3, 2).
Node 0 Circuit 2
ok
Node 1 Circuit 2
Node 2 Circuit 2
Node 0 Circuit 1
Node 1 Circuit 1
Node 2 Circuit 1
如果我真的了解 Erlang,我会采取不同的方式来改进这段代码吗?具体来说:
除了在最后两个 if 语句中指定一个无所事事的“真”子句之外,还有其他选择吗?
我真的是优雅地终止了吗?结束已注册的进程时是否需要任何特殊操作?
【问题讨论】:
标签: concurrency erlang