如果在 handle_call 完成之前被监视的进程死亡,会发生什么情况?
What happens when the monitored process dies before handle_call is complete?
我有一个关于 monitored/linked 进程死亡时间的问题,我想不出如何在实践中测试它。这是我担心的情况。
假设我有一个名为 master
和 slave
的进程。
master
将 trap_exit
设置为 true
。
master
确实 {ok, Pid} = slave:start_link()
从而将两者联系起来。
master
相当于 gen_server:call(Pid, Msg)
.
- 在消息到达
Pid
之前进程崩溃。
问题:
-
master
会先收到 EXIT
消息吗?或
master
会因 {noproc,{gen_server..
异常而失败吗,因为 Pid
已经死了?
不是经过验证的答案,但可能会发生这种情况。
首先我们应该了解的是 EXIT
是发送到 master
邮箱的邮件。与 noproc
错误相反,后者是在 master
进程上下文(不是消息)中生成的错误。
这意味着您可能会同时获得两者。问题是谁先来
由于 EXIT
消息是立即发送的,并且由于您说过进程在 call
到达之前崩溃,因此您首先会收到 EXIT
消息是有道理的。虽然,因为它们是独立的,所以有一个选项,即在 EXIT
邮件到达 master
的邮箱之前,您的 gen_server:call
将 return 与 noproc
错误。
如果您是出于实施目的而提出这个问题,我建议您涵盖这两种情况。我真的不认为 Erlang 会承诺哪个会是第一个。
我有一个关于 monitored/linked 进程死亡时间的问题,我想不出如何在实践中测试它。这是我担心的情况。
假设我有一个名为 master
和 slave
的进程。
master
将trap_exit
设置为true
。master
确实{ok, Pid} = slave:start_link()
从而将两者联系起来。master
相当于gen_server:call(Pid, Msg)
.- 在消息到达
Pid
之前进程崩溃。
问题:
-
master
会先收到EXIT
消息吗?或 master
会因{noproc,{gen_server..
异常而失败吗,因为Pid
已经死了?
不是经过验证的答案,但可能会发生这种情况。
首先我们应该了解的是 EXIT
是发送到 master
邮箱的邮件。与 noproc
错误相反,后者是在 master
进程上下文(不是消息)中生成的错误。
这意味着您可能会同时获得两者。问题是谁先来
由于 EXIT
消息是立即发送的,并且由于您说过进程在 call
到达之前崩溃,因此您首先会收到 EXIT
消息是有道理的。虽然,因为它们是独立的,所以有一个选项,即在 EXIT
邮件到达 master
的邮箱之前,您的 gen_server:call
将 return 与 noproc
错误。
如果您是出于实施目的而提出这个问题,我建议您涵盖这两种情况。我真的不认为 Erlang 会承诺哪个会是第一个。