我正在Erlang中实施聊天服务器。根据我的设计,每个客户端在服务器节点上都有一个相应的代理进程来处理消息。我正在将PIDs代理编写到数据库中,以便我可以在它们之间交换消息。
杀死PID时是否安全?例如,在我的服务器重新启动之后,PID仍然在数据库中(但进程将死亡),数据库中的PID是否有可能与其他一些(新创建的)重要进程冲突?
如果是这样,我不能简单地在客户端没有响应时终止代理。到目前为止,我还没有观察到它,但很高兴知道这一点。
答案 0 :(得分:7)
每次启动节点时,都会从0.0.0(init)以spawn顺序分配PID。所以,是的,如果在节点重启之间保存它们,就可以轻松获得PID冲突。
您已构建某种注册表以允许您查找特定客户端的PID - 此注册表需要及时删除死PID。典型的设计是注册表监视(erlang:monitor/2
)每个已注册的进程,并在进程终止并收到{'DOWN', Ref, process, Pid, Info}
消息时删除注册表项。
我还要补充一点,在erlang之外存储一个PID(如果你的数据库不是ets或mnesia)是不常见的 - 这个过程或节点死后PID不会有任何意义。
答案 1 :(得分:0)
可以在重新启动时重复使用PID。它们很可能会与其他PID发生冲突,因为它们是连续的。您应确保清除数据库中与已关闭的节点对应的任何PID。
1> spawn(fun () -> ok end).
<0.35.0>
2> spawn(fun () -> ok end).
<0.37.0>
3> spawn(fun () -> ok end).
<0.39.0>