erlang分布式消息发送

时间:2012-10-22 23:43:24

标签: erlang

我对分布式邮件发送和发送操作员有疑问。 erlang User's Guide将发送操作符描述为

Expr1 ! Expr2

并解释了Expr1是两个原子的元组的情况,第二个表示节点名称,但我不清楚第一个原子代表远程节点或进程的代码。

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

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

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

第一种是迄今为止最常见的。注册名称应谨慎使用。

我建议从Learn Your Some Erlang的并发章节开始,并根据需要回溯到前面的章节: http://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency#dont-panic

答案 1 :(得分:3)

假设你有两个节点:node1 @ localhost和node2 @ localhost,你在node1中将一个erlang进程注册为process1。

您可以将node2中的消息发送到node1中的process1:

{process1, node1@localhost} ! yourmessage.

希望这会有所帮助

答案 2 :(得分:1)

在这个表达式中:

  

Expr1!表达式2

Expr1 必须评估为(1) a pid ,(2)注册名称(原子)或(3)元组{Name,Node}

在第三种情况下,如您所知,当Expr1评估为元组{Name,Node} 时,Name是进程的注册名称(atom),Node是节点名称(也是一个原子),如 name @ server

例如:

% ------- in your node -------
(you@server)> register(shell, self()).

% ------- in my node -------
(me@server)> {shell, you@server} ! "hey you!".

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

出于测试目的,使用 nodes()功能列出已连接的节点。