通过PID杀死Erlang中的进程

Chi*_*ang 2 erlang

我正在Erlang中实现一个聊天服务器.根据我的设计,每个客户端在服务器节点上都有一个相应的代理进程来处理消息.我正在将代理的PID写入数据库,以便我可以在它们之间交换消息.

杀死PID时是否安全?例如,在我的服务器重新启动之后,PID仍然在数据库中(但进程将死掉),数据库中的PID是否有可能与其他一些(新创建的)重要进程冲突?

如果是这样,我不能简单地在客户端没有响应时终止代理.到目前为止,我还没有观察到它,但肯定知道这将是很好的.

arc*_*lus 7

每次启动节点时,PID都以0.0.0(init)的spawn顺序分配.所以,是的,如果在节点重启之间保存PID冲突,则可以轻松获得PID冲突.

您已构建某种注册表以允许您查找特定客户端的PID - 此注册表需要及时删除死PID.典型的设计是注册表监视(erlang:monitor/2)每个注册的进程,并在进程终止并{'DOWN', Ref, process, Pid, Info}收到消息时删除注册表项.

我还要补充说,在erlang之外存储一个PID(如果你的数据库不是ets或mnesia)是不正常的 - 因为PID在进程或节点死后不会有任何意义.