Упражнение по параллелизму в курсе Erlang: Можно ли улучшить мой ответ?

я делаю это упражнение из курса erlang.org :

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, мог бы я сделать по-другому, чтобы улучшить этот код? И в частности:

  • Есть ли какая-нибудь альтернатива указанию предложения «ничего не делать» "true" в последних двух операторах if?

  • Действительно ли я завершаю работу корректно? Требуются ли какие-либо особые действия при завершении зарегистрированного процесса?

5
задан Greg Hewgill 15 September 2012 в 03:05
поделиться