Erlang追踪:因果一致性?

时间:2014-04-07 09:04:12

标签: functional-programming erlang tracing

Erlang保证两个进程之间的因果一致性,即从进程A发送到进程B的消息保证按发送顺序到达,但不保证此订单与来自其他进程的消息有关。 / p>

我的问题是:当使用Erlang:trace函数跟踪多个进程时,会根据收到的跟踪消息的顺序提供更高级别的内存一致性,还是我们仍然有因果一致性吗?

将其置于更清晰的场景中:

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

由于

2 个答案:

答案 0 :(得分:1)

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

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

另一个案例可以通过几个不同的例子来解释: A是跟踪由B和C发送的消息,而B和C正在向D发送消息。理论上,A可能是不同于D的消息,但这可能是一个非常极端的边缘情况。

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

通常,就像在函数调用中包装消息一样是一个好主意,跟踪函数是个好主意,因为它们是正在执行的东西。只有例外是调试receive子句,其中某些保护或模式匹配可能导致进程忽略其中一条消息。在每个receive子句中进行函数调用(最好没有别的)是一个好习惯,因为这是你可以实际跟踪的东西。

答案 1 :(得分:1)

进程A会在B发送邮件的顺序与B发送邮件时看到来自A的跟踪邮件。

进程C会在C收到消息时看到来自A的跟踪消息,其顺序与A接收消息的顺序相同。

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

如果这回答了你的问题。