消息是否进入“/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
最佳答案
二郎!运算符等同于 erlang:send/2
发送到已知 pid 和发送到注册进程(本地、远程)之间有一点区别。后一种情况可以被视为 whereis(name)
和 send 的组合。 whereis 是当您尝试使用 atom 发送到失败的进程时失败的部分。
如果 pid 已知,则进程是否存在无关紧要。 !只会立即返回一条消息并安排它进行异步传递。如果进程已死,它将转到 /dev/null
。从概念上讲,为了为远程和本地进程提供透明体验,没有进行进程存在性检查,因为检查远程进程是否存在会导致 ping 时间延迟。
可以使用monitor
和link
函数来获取有关目标进程失败的通知。
如果您对进程的同步“调用”感兴趣,最好考虑使用 gen_server
行为,提供围绕消息传递的所有必要的异步包装。
关于erlang - 当我向 Erlang 中的已失效进程发送消息时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571018/