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

发布于 2024-08-09 17:27:30 字数 586 浏览 2 评论 0原文

我的模块中有一个名为“message/2”的函数,名为“message_passing”,该函数在另一个函数 hash/1 中调用。我需要 3 个名为 node1、node2 和 node3 的节点,但是当我想在名为“Current_Node”的变量中获取当前节点时,它不起作用。它显示一个错误。它无法获取我的变量中的当前节点。

** 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

I have a function named "message/2" in my module named "message_passing",This function is called in another function hash/1. I need 3 nodes named node1, node2, and node3, but when I want to get the current node in a variable named "Current_Node" it doesn't work. It shows an error. It is unable to get the current node in my variable.

** 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

薄暮涼年 2024-08-16 17:27:30

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

node() = node1@localhost.

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

Not sure if you are just using examples in your code, but the bif node() does not return an atom with just the node name, the host name is also returned.

node() = node1@localhost.

which would be the reason why your code is not working as you think it should.

呢古 2024-08-16 17:27:30

有一些内置函数可以在这里提供帮助,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 表达式。

There are a few built-in functions that can help here, erlang:node/0 returns the name of the node it's evaluated on and erlang:nodes(connected) returns the names of the nodes you are currently connected to.

So you could write the hash/1 function to send a message H to each connected node as:

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

The error message in your example comes from none of the clauses in the if expression being true - node() is not equal to node1, node2 or node3. It's common practise to avoid that by providing a true -> expression branch - what would be an else expression in other languages.

别低头,皇冠会掉 2024-08-16 17:27:30
hash(H) ->
  Nodes = [node1, node2, node3],
  CurrentNode = node(),
  [message(N, H) || N <- Nodes, N =/= CurrentNode],
  ok.
hash(H) ->
  Nodes = [node1, node2, node3],
  CurrentNode = node(),
  [message(N, H) || N <- Nodes, N =/= CurrentNode],
  ok.
屌丝范 2024-08-16 17:27:30

您遇到的问题是您尝试使用 if 在没有默认条件的情况下执行匹配(并且未满足您的预定义条件之一)。

我不认为我曾经在 erlang 应用程序中使用过 if ,但我认为有更简单的方法可以完成您在这里尝试的操作(并且您不必重写您的添加第四个节点时的代码)。

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

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

或者,也许是这样的:

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

The problem that you ran into was that you're trying to use if to perform a match without a default condition (and one of your predefined conditions isn't being met).

I don't think I've ever used if in an erlang app, but I think there are much more simple ways to do what you're trying here (and you won't have to rewrite your code when you add a fourth node).

Are you sure you aren't trying to write this?

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

Or, perhaps this:

lists:foreach(fun(N) -> message(N, H) end, [node1, node2, node3] -- [node()]).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文