簡體   English   中英

如何獲得Erlang集群中的當前節點名稱?

[英]How to get the current node name in an erlang cluster?

我在名為“ message_passing”的模塊中有一個名為“ message / 2”的函數,該函數在另一個函數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

不知道您是否僅在代碼中使用示例,但是bif node()不會僅返回具有節點名稱的原子,還會返回主機名。

node() = node1@localhost.

這就是您的代碼無法正常運行的原因。

有一些內置函數可以在此處提供幫助, 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分支來避免這種true -> expression在其他語言中,這將是else表達式。

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

您遇到的問題是您嘗試使用if在沒有默認條件的情況下進行比賽(並且不滿足您的預定義條件之一)。

我不認為我曾經使用過if在一個Erlang的應用程序,但我覺得有更多簡單的方法做到你想在這里什么(你將不必重寫代碼,當您添加第四個節點)。

您確定不是要寫這個嗎?

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

或者,也許這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM