6

嗨,问题如下:假设我们有链接的进程 A 和 B。进程的 A 标志 trap_exit 设置为 true。让 B 进程向 A 发送一条消息然后退出:

PidA ! 'msg',
exit(reason).

我想知道我们是否可以确定进程 A 将收到 'msg' 并且只有在它 {'EXIT', Pid, reason} 之后才会出现?我们可以预测消息的顺序吗?我在文档中找不到任何证据,但我想它会这样工作,但我需要一些证据。不想在这里有比赛条件..

4

3 回答 3

7

至于不要让这个问题悬而未决。这是 erlang-questions 邮件列表中的讨论:

http://thread.gmane.org/gmane.comp.lang.erlang.general/66788

长话短说:所有消息都是信号(或所有信号都是消息),出口被视为来自流程的消息,保证以它们发送的相同顺序到达。

于 2013-01-28T16:19:41.063 回答
2

对我来说听起来像是代码味道。为什么需要依赖trap_exit?您是否考虑过替代方案,例如适当的监控?

于 2013-01-28T16:57:14.403 回答
1

我在这里有 O'Reilly Erlang 编程书,在第 4 章的消息传递部分,它说:

邮件按投递顺序存储在邮箱中。如果两条消息从一个进程发送到另一个进程,则保证消息按照它们发送的相同顺序被接收。但是,此保证不会扩展到从不同进程发送的消息,并且在这种情况下,排序取决于 VM。

但是,在您的情况下,我不确定退出消息实际上来自进程 B。它可能起源于 VM 内部的某个地方。如果我想确定,我实际上会让进程 A 在收到您的通知消息时触发进程 B 的退出。

于 2013-01-28T08:14:00.643 回答