Erlang 节点只有在 Ping 后才能看到对方
Posted
技术标签:
【中文标题】Erlang 节点只有在 Ping 后才能看到对方【英文标题】:Erlang Nodes See Each Other Only After Ping 【发布时间】:2014-10-02 17:01:37 【问题描述】:我在 Mac OSX 上运行一些 erlang 代码,我遇到了这个奇怪的问题。我的应用程序是一个多节点应用程序,其中我有一个在节点之间共享的服务器实例(全局)。
代码完美运行,除了一件烦人的事情:不同的 erlang 节点(我在不同的终端窗口上运行每个节点)只能在 ping 后相互通信!
所以如果在终端 A 上我正在启动服务器,而在终端 B 上我正在运行
erl>global:registered_names().
terminalB 将返回一个空列表,除非在 terminalA 上启动服务器之前,我已经运行了一个 ping(从任一终端)。
例如,如果我在启动服务器之前在任一终端上执行此操作:
erl>net_adm:ping("terminalB").
然后我启动服务器并从第二个终端列出进程:
erl>global:registered_names().
这次我将从第二个终端看到注册的进程。
是否有可能仅仅 net_adm:ping 调用就可以进行某种允许通信的工作(如 DNS 解析或类似的东西)?
【问题讨论】:
【参考方案1】:分布式 Erlang 系统中的节点是松散连接的。这 第一次使用另一个节点的名称,例如,如果 spawn(Node,M,F,A) 或 net_adm:ping(Node) 被调用,一个连接 将尝试该节点。
我在这个链接中找到了这个:http://www.erlang.org/doc/reference_manual/distributed.html#id85336
我认为你应该阅读这篇文章。
【讨论】:
以上是关于Erlang 节点只有在 Ping 后才能看到对方的主要内容,如果未能解决你的问题,请参考以下文章
在 Erlang 中动态添加节点和 global_groups