我对监控/链接过程死亡的时间有疑问,我想不出如何在实践中测试它。这是我担心的情景。
假设我有一个名为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
异常而失败吗? 答案 0 :(得分:2)
不是一个明确的答案,但这里可能会发生什么。
我们应该首先理解的是EXIT
是一条发送到master
邮箱的邮件。与noproc
错误相反,错误是在master
进程上下文(而非消息)中生成的错误。
这意味着你可能会得到两者。问题是谁先来。
由于EXIT
消息是立即发送的,并且由于您说在call
到达之前进程崩溃,因此您首先会收到EXIT
消息。虽然,由于它们是独立的,因此可以选择在EXIT
邮件到达master
邮箱之前,gen_server:call
将返回noproc
错误。
如果您是出于实施目的而询问此问题,我建议您同时处理这两种情况。我真的不认为Erlang承诺哪一个会是第一个。