我目前正在以合理的方式学习 Erlang,但对主管的 gen_server 有疑问。如果 gen_server 进程崩溃并因此被主管重新启动,它会收到一个新的 pid。现在,如果我希望其他进程通过 Pid 引用该进程怎么办?在这些过程中“更新” Pid 有哪些好的惯用方法?
作为一些实际应用的练习,我正在编写一个锁服务器,客户端可以使用任意键请求锁。理想情况下,我希望有一个单独的进程来处理特定锁的锁定和释放,我的想法是如果在 N 时间后没有人请求它,我可以使用 gen_server 中的 timeout 参数来终止进程,因此只有当前相关的锁将留在内存中。现在,我有一个将锁名称映射到锁进程的目录进程。当锁定进程终止时,它会从目录中删除锁定。
我关心的是如何处理客户端请求锁定而锁定过程正在终止的情况。它还没有关闭,所以嗅探 pid 是活着的是行不通的。锁定过程尚未到达将其从目录中删除的子句。
有没有更好的方法来处理这个?
编辑
当前有两个 gen_server:“目录”维护来自 LockName -> Lock Process 的 ETS 表,以及使用 start_child 动态添加到监督树的“锁定服务器”。理想情况下,我希望每个锁服务器直接处理与客户端的对话,但我担心当进程处于崩溃中间时,获取/释放请求会被调用或强制转换发出(因此不会响应)到消息)。
以 {local} 或 {global} 开头将不起作用,因为它们可能有 N 个。