首页 > Erlang并发教程 > 7.2 Erlang并发编程-分布式机制
2013
11-15

7.2 Erlang并发编程-分布式机制

分布式机制

以下的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失败为止:

.....
monitor_node(Node, true),
receive
    {nodedown, Node} ->
         .....
end,
         .....

如果连接不存在,且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,所以:

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

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

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

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


7.2 Erlang并发编程-分布式机制》有 2 条评论

留下一个回复

你的email不会被公开。