分布式机制

以下的BIF可用于分布式编程:

spawn(Node,Mod,Func,Args)
在远程节点产生一个新的进程。
spawn_link(Node,Mod,Func,Args)
在远程节点产生一个新的进程并创建一个指向这个进程的链接。
monitor_node(Node,Flag)
Flagtrue,该BIF令当前进程监视节点Node。如果Node出错或消失,一个{nodedown, Node}消息将被发送给当前进程,若Flagfalse,则关闭监视。
node()
返回当前节点名称。
nodes()
返回已知的所有其他节点的名称列表。
node(Item)
返回Item所处节点的名称。Item可以是Pid、引用或端口。
disconnect_node(Nodename)
断开与节点Nodename的连接。

节点是分布式Erlang的一个核心概念。在分布式Erlang系统中,术语节点指一个可参与分布式Erlang事务的运行着的Erlang系统。独立的Erlang可通过启动一个称为网络内核的特殊进程来加入一个分布式Erlang系统。这个进程将计算BIFalive/2。网络内核将在??详述。一旦启动了网络内核,系统就处于活动状态。

处于活动状态的系统会被分配一个节点名称,该名称可以通过BIF node(Item)获得。该名称是一个全局唯一的原子式。不同的Erlang实现中节点名称的格式可能不同,但总是一个被@分为两部分的原子式。

BIF node(Item)返回创建Item的节点的名称,其中Item是一个Pid、端口或引用。

BIF nodes/0返回网络中与当前节点连接的所有其他节点的名称列表。

BIF monitor_node(Node,Flag)可用于监视节点。当节点Node失败或到Node的网络连接失败时,执行了monitor_node(Node,true)的进程将收到消息{nodedown,Node}。不幸的是,我们无法区分节点失败和网络失败。例如,以下代码会一直挂起到节点Node失败为止:

  1. .....
  2. monitor_node(Node, true),
  3. receive
  4. {nodedown, Node} ->
  5. .....
  6. end,
  7. .....

如果连接不存在,且monitor_node/2被调用,系统将尝试建立连接;若连接建立失败则投递一个nodedown消息。若针对同一节点连续两次调用monitor_node/2则在节点失败时将投递两条nodedown消息。

monitor_node(Node,false)的调用只是递减一个计数器,该计数器用于记录Node失败时需要向调用进程发送的nodedown消息的数量。之所以这么做,是因为我们往往会用一对匹配的monitor_node(Node,true)monitor_node(Node,false)来封装远程过程调用。

BIF spawn/3spawn_link/3用于在本地节点创建新进程。要在任意的节点创建进程,需要使用BIF spawn/4,所以:

  1. Pid = spawn(Node, Mod, Func, Args),

将在Node产生一个进程,而spawn_link/4会在远程节点产生一个进程并建立一个与当前进程的链接。

这两个BIF各自会返回一个Pid。若节点不存在,也会返回一个Pid,当然由于没有实际的进程被执行,这个Pid没什么用处。对于spawn_link/4,在节点不存在的情况下当前进程会收到一个“EXIT”消息。

几乎所有针对本地Pid的操作同样都对远程Pid有效。消息可以被发送至远程进程,也可以在本地进程和远程进程间建立链接,就好像远程进程执行于本地节点一样。这意味着,比方说,发送给远程进程的消息总是按发送顺序传送、不会受损也不会丢失。这些都是由运行时系统来保障的。消息接收的唯一可能的错误控制,就是由程序员掌控的link机制,以及消息发送方和接收方的显式同步。