什么是Erlang节点?

8

我在一本Erlang相关的书中看到了一个定义:

节点是一个自包含的Erlang系统,它包含一个完整的虚拟机,有自己的地址空间和一组进程。

但这给我带来了更多的问题。

什么是自包含的Erlang系统?

举个例子,我通过输入 erl shell 命令在终端上生成一个新的节点吗?我可以通过在多个终端上运行 erl shell 来开启多个节点吗?

如果以上的shell是不同的节点,那么它们之间是否有关联?还是默认情况下完全隔离的?如果这些是不同的节点,那么我应该将这种方法视为分布式编程,并且在需要独立运行和停止进程但又要连接它们时,应该深入研究这个主题吗?

1个回答

11

一个节点是运行Erlang虚拟机的一个实例。如果您在Linux上列出进程,每个节点都会有一个进程。

这意味着当您在终端上使用erl启动虚拟机时,每次都会启动一个新节点。

如果您正在编写应用程序,则通常不需要立即担心Erlang的分布式部分。一个节点可以处理数百万个Erlang进程,并且通过在单个节点上工作,您可以完全理解该模型。进程和节点是不同的概念,因此不要混淆它们。

节点彼此隔离,但Erlang具有许多用于它们之间通信的工具。您无需编写任何代码即可启用通信,这是一种内置功能。

一个非常简单的演示如下:

  1. 打开2个终端
  2. 在终端1中,使用短名称启动Erlang:erl -sname hi
  3. 在终端2中,使用另一个名称启动Erlang:erl -sname hi2
  4. shell将向您显示节点的名称:
  5. 终端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>
    

    终端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>
    
    我现在可以让节点相互ping通:
    (hi2@kwong-mbp)1> net_adm:ping('hi@kwong-mbp').
    pong
    
    如果我列出 hi@kwong-mbp 知道的节点,另一个节点现在会显示出来:
    (hi@kwong-mbp)1> nodes().
    ['hi2@kwong-mbp']
    

    Erlang节点使用另一个守护进程来确定一台计算机上运行着哪些Erlang节点。当一个节点正在寻找另一台主机上的节点时,它会向主机机器的epmd实例询问连接所需的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接