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/