如果在 handle_call 完成之前被监视的进程死亡,会发生什么情况?

What happens when the monitored process dies before handle_call is complete?

我有一个关于 monitored/linked 进程死亡时间的问题,我想不出如何在实践中测试它。这是我担心的情况。

假设我有一个名为 masterslave 的进程。

  1. mastertrap_exit 设置为 true
  2. master 确实 {ok, Pid} = slave:start_link() 从而将两者联系起来。
  3. master 相当于 gen_server:call(Pid, Msg).
  4. 消息到达Pid之前进程崩溃。

问题:

  1. master 会先收到 EXIT 消息吗?或
  2. master 会因 {noproc,{gen_server.. 异常而失败吗,因为 Pid 已经死了?

不是经过验证的答案,但可能会发生这种情况。

首先我们应该了解的是 EXIT 是发送到 master 邮箱的邮件。与 noproc 错误相反,后者是在 master 进程上下文(不是消息)中生成的错误。
这意味着您可能会同时获得两者。问题是谁先来

由于 EXIT 消息是立即发送的,并且由于您说过进程在 call 到达之前崩溃,因此您首先会收到 EXIT 消息是有道理的。虽然,因为它们是独立的,所以有一个选项,即在 EXIT 邮件到达 master 的邮箱之前,您的 gen_server:call 将 return 与 noproc错误。

如果您是出于实施目的而提出这个问题,我建议您涵盖这两种情况。我真的不认为 Erlang 会承诺哪个会是第一个。