【问题标题】:What happens when the monitored process dies before handle_call is complete?当被监控的进程在handle_call 完成之前死亡时会发生什么?
【发布时间】:2016-12-17 13:29:15
【问题描述】:

我有一个关于受监控/链接进程死亡时间的问题,我想不出如何在实践中对其进行测试。这是我担心的情况。

假设我有一个名为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 已经死了?

【问题讨论】:

    标签: erlang erlang-otp gen-server


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多