消息是否进入“/dev/null”?这就是我希望发生的事情。
似乎是!如果第一个操作数是 pid,而不是原子,则运算符不会告诉发送者接收者一开始就死了。我想这没有用,因为收件人可能会在收到消息后立即死亡,而发件人也不会发现这一点。
但我觉得发送者应该得到某种错误,因为当第一个操作数是原子而不是 pid 时会发生这种情况。例如
> register(am_i_defunct, P=spawn_link(fun() -> timer:sleep(3000) end)).
true
> am_i_defunct ! herp.
herp
> am_i_defunct ! herp.
** exception error: bad argument
in operator !/2
called as am_i_defunct ! herp
> P ! derp.
derp
Run Code Online (Sandbox Code Playgroud)
二郎!运算符相当于erlang:send/2
发送到已知 pid 和发送到注册进程(本地、远程)之间存在一些差异。后面的情况可以被认为是whereis(name)和 发送的组合。whereis 是当您尝试使用 atom 发送到失败的进程时失败的部分。
如果 pid 已知,则进程是否存在无关紧要。!将立即返回一条消息并安排它进行异步传递。如果进程已死,它将转到/dev/null. 从概念上讲,为了为远程和本地进程提供透明体验,没有进行进程存在检查,因为检查远程进程存在将导致 ping 时间延迟。
可以使用monitor和link函数来获取目标进程失败的通知。
如果您对同步“调用”处理感兴趣,最好考虑使用gen_server行为提供所有必要的环绕消息传递的异步包装。