2016-08-12 219 views
2

我看到約二郎一本書的定義:什麼是Erlang節點?

節點是包含 完整的虛擬機都有自己的地址空間和自己的一套 過程的自包含的Erlang系統。

但是這給我提出了更多的問題。

什麼是自包含的Erlang系統?

作爲一個例子,我是通過去終端並運行erl shell來產生一個新節點嗎?我是否打開多個節點並打開多個終端並分別運行erl shell

是否像上面打開的貝殼無論如何相互關聯或默認情況下是完全隔離?如果這些是不同的節點,那麼我是否會將這種方法作爲分佈式編程對待,並且應該深入研究該主題,以便我想單獨運行並停止進程,然後將它們連接起來?

回答

2

節點是運行Erlang虛擬機的一個實例。如果您在Linux上並列出了進程,則每個節點都會有一個進程。

這意味着當您使用erl在終端上啓動虛擬機時,您每次都會看到一個新節點。

如果你正在編寫一個應用程序,你通常不需要擔心Erlang的分佈式部分。一個節點可以處理數百萬個Erlang進程,並且您可以通過在單個節點上工作來理解該模型。進程和節點是不同的概念,所以不要讓他們感到困惑。

節點相互隔離,但Erlang有很多設備可以在它們之間進行通信。您不必編寫任何代碼來啓用通信,這是一項內置功能。

這方面的一個簡單的演示能夠極其簡單地進行:erl -sname hi

  • 在終端2中,與另一種啓動二郎:

    1. 打開2個端子
    2. 在終端1中,用短名稱開始二郎名稱:erl -sname hi2
    3. 外殼會告訴你什麼是你的節點現在被稱爲:

      端子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) 
      
      ([email protected])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) 
      ([email protected])1> 
      
    4. 我現在可以得到的節點互相ping通:

      ([email protected])1> net_adm:ping('[email protected]'). 
      pong 
      
    5. 如果我列出[email protected]知道,其他節點將節點現在顯示:

      ([email protected])1> nodes(). 
      ['[email protected]'] 
      

    Erlang節點使用另一個守護進程來確定在一臺機器上運行的Erlang節點。當節點正在尋找另一主機上的節點時,它會向主機的epmd實例請求連接所需的信息。