Ref*_*fer 2 erlang multithreading gen-server
我目前正在以合理的方式学习Erlang,但对主管的gen_server有疑问.如果gen_server进程崩溃并由主管重新启动,它将收到一个新的pid.现在,如果我希望其他进程通过Pid引用该进程,该怎么办?在这些流程中"更新"Pid有哪些好的惯用方法?
作为一个实际应用的练习,我正在编写一个锁定服务器,客户端可以使用任意键请求锁定.理想情况下,我希望有一个单独的进程来处理特定锁的锁定和释放,这个想法是我可以使用gen_server中的timeout参数来终止进程,如果在N个时间之后没有人请求它,那么只有当前相关的锁将留在内存中.现在,我有一个目录进程,它将锁名称映射到锁进程.当锁定进程终止时,它会从目录中删除锁定.
我关心的是如何处理客户端在锁定进程正在终止时请求锁定的情况.它还没有关闭,所以嗅到pid活着是行不通的.锁定进程尚未到达从目录中删除它的子句.
有没有更好的方法来处理这个?
编辑
目前有两个gen_servers:'directory'维护一个来自LockName - > Lock Process的ETS表,以及'lock servers',它们使用start_child动态添加到监督树.理想情况下,我希望每个锁服务器直接处理与客户端的通话,但我担心当进程处于崩溃中时,获取/释放获取/释放请求的场景(因此将不会响应)消息).
从{local}或{global}开始将无效,因为可能有N个.
诀窍是命名进程,不要通过它的pid引用它.你通常有3个可行的选择,
使用注册名称.这就是andreypopp所暗示的.您可以通过注册名称来引用服务器.本地注册的名称必须是原子,这可能会对您有所限制.全球注册名称没有此限制,您可以注册任何条款.
主管知道Pid.问一下.您必须将Supervisor Pid传递给流程.
或者,使用gproc应用程序(存在于http://github.com上).它允许您创建一个通用的流程注册表 - 您可以通过ETS完成该操作,但是窃取好的代码而不是自己实现.
如果所有进程都是同一监督树的一部分,则pid可用.因此,其中一人死亡意味着其他人的死亡.因此,Pids回收无关紧要.