Erlang 中的消息发送是异步,这意味着发送表达式如 PidB !由进程
会立即产生结果 PidA
计算的 msgmsg
,而不会阻塞后者。当然,它的副作用是发送msg
到PidB
。
由于这种消息传递模式不提供任何消息传递保证,因此发送者必须通过要求接收者进行相应确认来自行确定消息是否已实际传递。毕竟,可能并不总是需要确认消息是否已送达。
这在本地和分布式情况下都成立:在后一种情况下,发送者不能简单地假设远程节点始终可用;在本地场景中,进程位于同一个 Erlang 节点上,进程可能会向不存在的进程发送消息。
我很好奇!
的副作用部分,即,消息发送,当发送者和接收者进程运行在VM级别时如何工作相同节点。我特别想知道发送操作在返回之前是否完成。我所说的完成是指,对于本地进程的特定情况,发送方:(i) 获取接收方消息队列上的锁,(ii)将消息直接写入队列,(iii) 释放锁,(iv) 最终返回。
我遇到了这个post我没有完全理解,尽管它似乎表明情况可能是这样。
最佳答案
埃里克·斯坦曼的The Beam Book ,它解释了 Erlang VM 的许多实现细节,在其 "Lock Free Message Passing" 中详细回答了您的问题。部分。完整的答案太长,无法复制到这里,但对您的问题的简短回答是,是的,发送进程将其消息完全复制到接收者可访问的内存区域。如果您查阅这本书,您会发现它比您在问题中描述的步骤i-iv更复杂,因为诸如不同的send
标志、是否已经锁定等问题被其他进程占用、多个内存区域以及接收进程的状态。
关于erlang - 在 Erlang 中发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54951227/