2010-11-18 160 views
2

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

当我杀死PIDs是否安全?例如,在我的服务器重新启动后,PID仍在数据库中(但进程将会死亡),数据库中的PID是否会与其他一些(新创建的)重要进程冲突?

如果是这样,我不能简单地杀死客户端没有响应时的代理。到目前为止,我还没有观察到它,但很确定地知道这一点。

回答

7

每次启动节点时,PID都会从0.0.0(init)开始以spawn顺序分配。所以是的,如果您在节点重新启动之间保存它们,您可以轻松获得PID冲突。

你已经建立了某种形式的注册表,让你查找的PID为特定的客户端 - 此注册表需要去除及时死的PID。一个典型的设计是用于注册表监视(erlang:monitor/2)每个注册的进程并删除注册表项,当进程死亡并收到{'DOWN', Ref, process, Pid, Info}消息。

我还想补充一点,存储PID外二郎(如果你的数据库是不是ETS或者Mnesia的)是不寻常的这个原因 - 进程或节点去世后,PID将没有任何意义。

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> 
+0

不应该是第一句话中的“Pids can not be ..”吗? – ZeissS 2010-11-18 08:12:13

+0

不,我的意思是我说的。 [VM]重新启动时可以重复使用Pid。 – 2010-11-18 10:50:40