【问题标题】:Message sending in Erlang under the hood在 Erlang 中发送消息
【发布时间】:2019-07-23 21:01:06
【问题描述】:

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

由于这种消息传递模式提供任何消息传递保证,发送者必须自己确定消息是否已实际传递,方法是要求接收者进行相应的确认。毕竟,可能并不总是需要确认消息是否已送达。

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


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

我遇到了这个post,我并不完全理解,尽管它似乎表明可能是这种情况。

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2014-06-07
      • 1970-01-01
      • 2017-11-02
      • 2015-07-01
      • 2016-10-04
      • 2011-08-31
      • 2012-09-12
      • 2017-06-26
      相关资源
      最近更新 更多