在handle_call完成之前被监视的进程终止时会发生什么?

时间:2016-08-11 00:50:03

标签: erlang otp gen-server

我对监控/链接过程死亡的时间有疑问,我想不出如何在实践中测试它。这是我担心的情景。

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

  1. mastertrap_exit设置为true
  2. master执行{ok, Pid} = slave:start_link()因此将这两者联系起来。
  3. master相当于gen_server:call(Pid, Msg)
  4. 之前,消息到达Pid进程崩溃。
  5. 问题:

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

1 个答案:

答案 0 :(得分:2)

不是一个明确的答案,但这里可能会发生什么。

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

由于EXIT消息是立即发送的,并且由于您说在call到达之前进程崩溃,因此您首先会收到EXIT消息。虽然,由于它们是独立的,因此可以选择在EXIT邮件到达master邮箱之前,gen_server:call将返回noproc错误。

如果您是出于实施目的而询问此问题,我建议您同时处理这两种情况。我真的不认为Erlang承诺哪一个会是第一个。