erlang - 当我向 Erlang 中的已失效进程发送消息时会发生什么?

标签 erlang

消息是否进入“/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 时间延迟。

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

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

关于erlang - 当我向 Erlang 中的已失效进程发送消息时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571018/

相关文章:

erlang - 使用 lager 和 poolboy 停止应用程序时出现奇怪的错误消息

erlang - 为什么我无法运行这个 Erlang 演示应用程序?

erlang - 缺少模型之间的 ecto 关联

erlang - 如何使用 rebar3 配置 httpc 配置文件?

multithreading - 如何在没有竞争条件的情况下在 Erlang 中按需启动 gen_server 或 gen_fsm?

erlang - 如何使用Erlang OTP主管行为以自定义状态重新启动子级?

erlang - 是否可以向 elixir/erlang 中的所有子进程发送消息?

mysql - 如何用Erlang、Yaws连接mysql数据库

erlang - 如何在 Erlang 中安装应用程序?

data-structures - Erlang 中最接近哈希的东西是什么?