Functional programming Erlang追踪:因果一致性?

Functional programming Erlang追踪:因果一致性?,functional-programming,erlang,trace,Functional Programming,Erlang,Trace,Erlang保证两个进程之间的因果一致性,也就是说,从进程A发送到进程B的消息保证按照它们发送的顺序到达,但是对于从其他进程到达的消息,不保证按照这个顺序到达 我的问题是:当使用Erlang:trace函数跟踪多个进程时,这是否提供了更高级别的内存一致性(按接收到的跟踪消息的顺序),或者我们仍然具有因果一致性 更清楚地说: 如果进程A正在跟踪进程B和C发送的消息,我们可以保证从B接收的跟踪消息是按顺序(因果一致性)接收的,但是相对于从C接收的跟踪消息,它们的顺序是否有任何保证 谢谢当启用跟踪是V

Erlang保证两个进程之间的因果一致性,也就是说,从进程A发送到进程B的消息保证按照它们发送的顺序到达,但是对于从其他进程到达的消息,不保证按照这个顺序到达

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

更清楚地说:

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


谢谢

当启用跟踪是VM级操作时,跟踪消息本身是从被跟踪进程发送到正在进行跟踪的进程的标准Erlang消息(通过调用
Erlang:trace/3启用跟踪)。所以,您可能会遇到的所有不一致都是由消息传递本身的异步性质引起的

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

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

但这对于理解您的系统来说仍然不是问题,如果您想知道D接收到的消息的顺序,您可以跟踪D接收到的消息。为了确保这一点,您还应该跟踪
receive
子句中调用的函数(如果有),因为接收消息可能和处理接收到的消息不同


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

Process
a
将看到
B
中的跟踪消息,它发送消息的顺序与
B
发送消息的顺序相同


当进程
A
以与
C
接收消息相同的顺序接收消息时,它将看到来自
C
的跟踪消息

如果看到这些跟踪消息是从两个不同的进程发送的,则无法保证相对顺序
A
将看到这些消息
A
将按照消息到达
A
的顺序查看消息。这与从多个进程接收消息时的行为相同,您可以看到消息到达该进程的顺序,这可能与它们发送的顺序不同。请注意,仅当发送时间非常接近时,可能会影响结果


如果这回答了您的问题。

使用第四个过程D使示例更加清晰!因此,我们只能在Erlang跟踪中假设因果一致性,即使只有在极少数情况下才会违反这一点。谢谢