2012-10-22 58 views
4

我有一个问题关于分布式消息发送和发送操作员。二郎神User's Guide描述发送操作员erlang分布式消息发送

Expr1 ! Expr2 

,并解释表达式1是两个原子,第二个代表节点名的元组的情况下,但我不明白什么第一个原子从代表远程节点或进程的代码。

您的帮助表示赞赏。

回答

6

语法在您引用的句子中有点含糊不清。这三个选项是:

  • 进程ID,它是从某些Erlang函数返回的不透明数据类型,主要是spawn和spawn_link。
  • 本地节点(即本地VM)上的注册名称。需要这种情况的例子是长期运行的服务器应用程序,您希望进程能够与关键实用程序服务(如DNS缓存)进行通信。
  • 包含注册名称和其所在节点名称(如果另一个VM,可能位于不同主机上)的元组。

第一个是迄今为止最常见的。注册名字的目的是明智地使用。

我建议你从了解你一些二郎开始并发章,并回溯所必需的前面几章: http://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency#dont-panic

3

假设您有两个节点:节点1 @本地和node2 @本地主机,注册node1中erlang进程为process1。

您可以从节点2将消息发送到过程1在节点1为:

{process1, [email protected]} ! yourmessage. 

希望这将有助于

1

在这个表达式:

表达式1!表达式2

表达式1必须计算为(1)一个pid,(2)注册的名称(原子)或(3)一个元组{名称,节点}

在第三情况下,你想知道,当表达式1计算结果为元组{名称,节点},名称是一个过程的注册名(原子)和节点是一个节点的名称(也原子)像name @ server

例如:

% ------- in your node ------- 
([email protected])> register(shell, self()). 

% ------- in my node ------- 
([email protected])> {shell, [email protected]} ! "hey you!". 

注意,发送消息给其他节点的其他进程之前,首先你必须连接到它们。例如spawn(节点,模块,函数,参数)net_adm:ping(节点)

用于测试目的使用节点()函数列出连接的节点。