gpt4 book ai didi

elixir - 为什么在实现 GenServer 时跟踪 #Reference 比跟踪 #PID 更好?

转载 作者:行者123 更新时间:2023-12-05 00:54:41 26 4
gpt4 key购买 nike

Elixir 的Mix and OTP Guide Chapter GenServer解释如何使用 GenServer 实现一个注册服务器持有代理。 .

每个代理的 PID 都保存在一个映射中,其中键是客户端给出的代理名称,值是代理的 PID。

为了避免保留对死代理的引用,该指南建议使用 Process.monitor/1 监视新创建的代理。并通过添加一个名为 refs 的新 map 稍微修改状态,包含引用(由 Process.monitor/1 返回的值)作为键和代理的名称作为值。它还展示了如何使用 handle_info/2 处理监控消息。更新 refs .
Process.monitor/1接收一个 PID(例如 #PID<0.66.0> )作为参数并返回一个引用(例如 #Reference<0.0.0.551> )。 :DOWN消息被 handle_info/2 捕获提供PID和引用。

因为我们一直都知道这两个值:在 refs 中使用引用作为键比使用 PID 有什么好处? ,如果有?

最佳答案

这是一个一致性问题。虽然您只监视进程,但没有区别。但底层 :erlang.monitor/2 不仅可以监控进程:还有端口等,基本上没有PID .
从文档:

Object

The monitored entity, which triggered the event. When monitoring a local process or port, Object will be equal to the pid() or port() that was being monitored. When monitoring process or port by name, Object will have format {RegisteredName, Node} where RegisteredName is the name which has been used with monitor/2 call and Node is local or remote node name (for ports monitored by name, Node is always local node name).


总结: Reference是一个实体,被监控。它可能是一个进程、一个端口,等等。虽然你不想 demonitor/1 关闭端口监控的整个过程,你应该使用引用。

关于elixir - 为什么在实现 GenServer 时跟踪 #Reference 比跟踪 #PID 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39607078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com