在引擎盖下以Erlang发送消息

在引擎盖下以Erlang发送消息,erlang,Erlang,Erlang中的消息发送是异步的,这意味着像PidB!由进程PidA评估的msg立即生成结果msg,而不阻塞后者。当然,它的副作用是将msg发送到PidB 由于此消息传递模式不提供任何消息传递保证,因此发送方必须通过要求接收方进行相应确认来确定消息是否已实际传递。毕竟,可能并不总是需要确认消息是否已传递 这在本地和分布式情况下都适用:在后一种情况下,发送方不能简单地假设远程节点始终可用;在本地场景中,当进程位于同一Erlang节点上时,进程可能会向不存在的进程发送消息 我很好奇的副作用部分是怎

Erlang中的消息发送是异步的,这意味着像
PidB!由进程
PidA
评估的msg
立即生成结果
msg
,而不阻塞后者。当然,它的副作用是将
msg
发送到
PidB

由于此消息传递模式不提供任何消息传递保证,因此发送方必须通过要求接收方进行相应确认来确定消息是否已实际传递。毕竟,可能并不总是需要确认消息是否已传递

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


我很好奇
的副作用部分是怎样的(即消息发送)在VM级别工作。特别是,我想知道发送操作是否在返回之前完成。所谓完成,我的意思是,对于本地进程的特定情况,发送方:(I)在接收方的消息队列上获取锁,(ii)将消息直接写入其队列,(iii)释放锁,(iv)最终返回

我遇到了这个我并不完全理解的问题,尽管它似乎表明可能是这样。

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