我在其中一本关于Erlang的书中看到了一个定义:
节点是一个独立的Erlang系统,包含一个完整的虚拟机,它有自己的地址空间和自己的进程集.
但这给我带来了更多问题.
什么是独立的Erlang系统?
例如,通过转到终端并运行来生成新节点erl shell吗?通过打开多个终端并erl shell在每个终端中运行来打开多个节点吗?
如上所述打开的外壳是否相互关联或默认情况下是否完全隔离?如果这些是不同的节点,那么我是否将此方法视为分布式编程,并且应该深入研究该主题,以防我想独立运行和停止进程,然后连接它们?
节点是运行的Erlang虚拟机的一个实例.如果你在linux上并且列出了进程,那么每个节点都会有一个进程.
这意味着当您使用终端上的vm启动时erl,您每次都会看到一个新节点.
如果您正在编写应用程序,通常不需要担心Erlang的分布式部分.一个节点可以处理数百万个Erlang进程,您可以通过在单个节点上工作来理解该模型.进程和节点是不同的概念,所以不要让它们混淆.
节点彼此隔离,但Erlang有许多用于它们之间通信的工具.您不必编写任何代码来启用通信,它是内置功能.
一个简单的演示可以非常简单地完成:
erl -sname hierl -sname hi2shell将显示您现在调用的节点:
1号航站楼:
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Eshell V7.1 (abort with ^G)
(hi@kwong-mbp)1>
Run Code Online (Sandbox Code Playgroud)
2号航站楼:
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Eshell V7.1 (abort with ^G)
(hi2@kwong-mbp)1>
Run Code Online (Sandbox Code Playgroud)我现在可以让节点相互ping通:
(hi2@kwong-mbp)1> net_adm:ping('hi@kwong-mbp').
pong
Run Code Online (Sandbox Code Playgroud)如果我列出节点hi@kwong-mbp知道的,那么另一个节点现在将显示:
(hi@kwong-mbp)1> nodes().
['hi2@kwong-mbp']
Run Code Online (Sandbox Code Playgroud)Erlang节点使用其他后台程序要弄清楚什么Erlang节点是一台机器上运行.当节点在另一台主机上查找节点时,它会向主机的epmd实例请求连接所需的信息.