5

Erlang用户指南发送操作符描述为

8.9 发送

Expr1 ! Expr2

将 的值Expr2作为消息发送到 指定的进程 Expr1。的值Expr2也是表达式的返回值。

Expr1必须评估为pid注册名称(原子)或tuple {Name,Node}Name是一个原子,Node是一个节点名,也是一个原子。

  • 如果Expr1计算结果为一个名称,但该名称未注册,badarg则会发生运行时错误。
  • 向 pid 发送消息永远不会失败,即使 pid 标识了一个不存在的进程。
  • 分布式消息发送,也就是说,如果Expr1评估为一个元组 {Name,Node}(或位于另一个节点的 pid),也永远不会失败。

在分布式消息发送的情况下,我不清楚{Name,Node}远程节点或进程的代码中的第一个原子代表什么。

感谢您的帮助。

4

3 回答 3

7

您引用的句子中的语法有点模棱两可。这三个选项是:

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

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

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

于 2012-10-23T00:13:01.823 回答
3

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

您可以将消息从 node2 发送到 node1 中的 process1,如下所示:

{process1, node1@localhost} ! yourmessage.

希望这会有所帮助

于 2012-10-23T12:48:09.103 回答
1

在这个表达式中:

经验1!Expr2

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

在第三种情况下,正如您想知道的那样,当 Expr1 计算为元组 {Name, Node}时, Name 是进程的注册名称(原子),而 Node 是节点名称(也是原子),如name@server

例如:

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

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

请注意,在向其他节点中的其他进程发送消息之前,首先您必须连接到它们。例如使用spawn(Node, Module, Function, Arguments)net_adm:ping(Node)

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

于 2013-12-07T13:30:28.557 回答