functional-programming - Erlang追踪: Causal consistency?

标签 functional-programming erlang trace

Erlang 保证两个进程之间的因果一致性,即从进程 A 发送到进程 B 的消息保证按照发送的顺序到达,但不保证与从其他进​​程到达的消息相关的顺序。

我的问题是:当使用 Erlang:trace 函数跟踪多个进程时,这是否可以在接收跟踪消息的顺序上提供更高级别的内存一致性 ,或者我们仍然具有因果一致性吗?

把它放在一个更清晰的场景中:

如果进程 A 正在跟踪进程 B 和 C 发送的消息,我们可以保证来自 B 的跟踪消息按顺序接收(因果一致性),但是它们相对于来自 C 的跟踪消息的顺序是否有任何保证?

谢谢

最佳答案

虽然启用跟踪是虚拟机级别的操作,但跟踪消息本身是从被跟踪进程发送到正在执行跟踪的进程的标准 Erlang 消息(通过调用 erlang:trace/3 启用跟踪)。因此,您可能遇到的所有不一致都是由消息传递本身的异步性质引起的。

如果 A 和 C 正在跟踪 B 发送的消息,他们将以相同的顺序看到它们。

另一种情况可以用一些不同的例子来更容易地解释: A 正在跟踪 B 和 C 发送的消息,而 B 和 C 正在向 D 发送消息。理论上,A 这些消息的顺序可能与 D 不同,但这必须是非常极端的边缘情况。

但这对于理解你的系统来说仍然不成问题,如果你想知道 D 接收到的消息的顺序,你可以跟踪 D 接收到的消息。为了确定,你还应该跟踪在receive 子句(如果有的话),因为接收消息可能与处理接收到的消息不同。

一般来说,就像将消息发送包装在函数调用中是一个好主意一样,跟踪函数也是一个好主意,因为它们是正在执行的东西。唯一的异常(exception)是调试 receive 子句,其中某些防护或模式匹配可能会导致进程忽略其中一条消息。在每个 receive 子句中进行函数调用(最好没有其他内容)是一个很好的做法,因为这是您可以实际跟踪的内容。

关于functional-programming - Erlang追踪: Causal consistency?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22907943/

相关文章:

javascript - JavaScript 中的函数式数据类型

c++ - 通过端口从 Erlang 调用 C 函数的最快和最简单的方法是什么?

erlang - 错误函数子句?

GDB 跟踪 : No current trace frame

python - 改进 python 中的堆栈跟踪钩子(Hook)

c# - "relevant"是XmlWriterTraceListener的非线程安全性如何?

javascript - 我可以将 map() 的索引增加 2 吗?

swift - '数组 <元素 >' is not convertible to ' 数组 <Int>'

functional-programming - 如何在 OCaml 的 O(n) 中洗牌?

erlang - 钢筋发布,应用程序选项配置