消息在引擎盖下发送

时间:2019-03-01 19:35:31

标签: erlang

Erlang中的消息发送是异步,这意味着由进程PidB ! msg评估的PidA之类的发送表达式会立即产生结果msg,而不会阻塞后者。自然,它的副作用是发送 msgPidB

由于这种消息传递方式不能提供任何消息传递保证,因此发送者必须通过要求接收者进行相应确认来确定消息是否已经真正传递。毕竟,不一定总是需要确认是否已传递邮件。

在本地和分布式情况下都适用:在后一种情况下,发送方不能简单地假设远程节点始终可用;在本地情况下,如果进程位于同一Erlang节点上,则进程可能会将消息发送到不存在的进程。


对于发件人和收件人进程位于上的!的副作用部分,即 ie ,消息发送在VM级别上的工作方式,我感到很好奇相同的节点。特别是,我想知道发送操作是否在返回之前完成。通过完成,我的意思是说,对于本地进程的特定情况,发件人:(i)获得收件人收件人(ii)的消息队列上的锁将消息直接写入其队列中,(iii)释放锁,然后(iv)最终返回。

我碰到了一个post,虽然似乎表明情况确实如此,但我并没有完全理解。

1 个答案:

答案 0 :(得分:4)

Erik Stenman的The Beam Book解释了Erlang VM的许多实现细节,并在其"Lock Free Message Passing"部分中详细解答了您的问题。完整的答案太长了,无法在此处复制,但是对您的问题的简短答案是,是的,发送过程将其消息完全复制到接收者可以访问的存储区域。如果您查阅本书,您会发现它比问题中描述的步骤 i-iv 更复杂,这是由于诸如send标志不同,是否其他人已经使用了锁等问题引起的。进程,多个内存区域以及接收进程的状态。

相关问题