当我向Erlang中的一个已解散的进程发送消息时会发生什么?

时间:2015-02-17 21:01:05

标签: erlang

消息是否进入" / dev / null"?这就是我希望会发生的事情。

好像是的!如果第一个操作数是pid,而不是原子,则操作员不会告诉发件人收件人已经死了。我想这不会有用,因为收件人可能会在收到邮件后立即死亡,发件人也不会发现这一点。

但我觉得发送者应该得到某种错误,因为当第一个操作数是原子而不是pid时会发生什么。 E.g。

> 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

1 个答案:

答案 0 :(得分:4)

Erlang!运算符等效于erlang:send/2

发送到已知的pid和发送到已注册的进程(本地,远程)之间有一点区别。后一种情况可以视为whereis(name)和发送的组合。 whereis是当您尝试使用atom发送到失败进程时失败的部分。

如果已知pid,则进程是否存在无关紧要。 !将立即返回一条消息并安排它进行异步传递。如果进程已经死亡,它将转到/dev/null。从概念上讲,为远程和本地进程提供透明体验,没有进行进程存在检查,因为检查远程进程是否存在会导致ping时间延迟。

可以使用monitorlink函数来获取有关目标进程失败的通知。

如果您对同步“调用”进行处理感兴趣,最好考虑使用gen_server行为提供围绕消息传递的所有必要的包装异步。