如何在erlang集群中获取当前节点名称?

时间:2009-11-04 08:05:49

标签: erlang

我的模块名为“message_passing”中有一个名为“message / 2”的函数,此函数在另一个函数hash / 1中调用;;;现在这里是问题所在。我需要3个名为node1,node2,node3的节点,但是当我想在名为“Current_Node”的变量中获取当前节点时,它会运行。它显示错误。它无法获取我的变量中的当前节点。如果您的解决方案请发送电子邮件至deep_vision87@hotmail.com,我将非常感谢。

** exception error: no true branch found when evaluating an if expression
     in function  message_passing:hash/1

hash(H)->
  Current_Node=node(),
   if
    Current_Node==node1->
     message(node2,H),
     message(node3,H);
    Current_Node==node2->
     message(node1,H),
     message(node3,H);
    Current_Node==node3->
     message(node1,H),
     message(node2,H)
   end

4 个答案:

答案 0 :(得分:4)

不确定您是否只在代码中使用示例,但bif node()不返回仅包含节点名称的atom,也会返回主机名。

node() = node1@localhost.

这就是为什么你的代码没有像你想象的那样工作的原因。

答案 1 :(得分:4)

有一些内置函数可以在这里提供帮助,erlang:node/0返回它所评估的节点的名称,erlang:nodes(connected)返回当前连接的节点的名称。

因此,您可以编写hash/1函数,以便向每个连接的节点发送消息H

hash(H) ->
    lists:foreach(fun (N) -> message(N, H) end,
                  erlang:nodes(connected)).

示例中的错误消息来自if表达式中的所有子句都为true - node()不等于node1,node2或node3。通常的做法是通过提供true -> expression分支来避免这种情况 - 在其他语言中使用else表达式。

答案 2 :(得分:3)

hash(H) ->
  Nodes = [node1, node2, node3],
  CurrentNode = node(),
  [message(N, H) || N <- Nodes, N =/= CurrentNode],
  ok.

答案 3 :(得分:2)

您遇到的问题是您尝试使用if执行匹配而没有默认条件(并且未满足您的某个预定义条件)。

我不认为我曾经在erlang应用程序中使用if,但我认为有更简单的方法可以做你在这里尝试的事情(而且你不必重写你的添加第四个节点时的代码。)

你确定你不是想写这个吗?

lists:foreach(fun(N) -> message(N, H) end, nodes()).

或者,或许这个:

lists:foreach(fun(N) -> message(N, H) end, [node1, node2, node3] -- [node()]).