gpt4 book ai didi

multithreading - transient gen_server 进程和更新 pids

转载 作者:行者123 更新时间:2023-12-02 06:23:56 24 4
gpt4 key购买 nike

我目前正在以合理的速度学习 Erlang,但对 gen_server 有一个问题要问主管。如果 gen_server 进程崩溃并因此被主管重新启动,它会收到一个新的 pid。现在,如果我希望其他进程通过 Pid 引用该进程怎么办?在这些进程中“更新”PID 有哪些好的惯用方法?

作为一些实际应用的练习,我正在编写一个锁服务器,客户端可以在其中请求使用任意 key 的锁。理想情况下,我希望有一个单独的进程处理特定锁的锁定和释放,我的想法是,如果在 N 时间后没有人请求它,我可以使用 gen_server 中的超时参数来终止进程,因此目前只有相关锁将保留在内存中。现在,我有一个将锁名称映射到锁进程的目录进程。当锁定进程终止时,它会从目录中删除锁定。

我关心的是如何处理当锁定进程正在终止时客户端请求锁定的情况。它还没有关闭,所以嗅探 pid 是活的是行不通的。锁定进程尚未到达将其从目录中删除的子句。

有没有更好的方法来处理这个问题?

编辑

目前有两个 gen_servers:“目录”维护来自 LockName -> Lock Process 的 ETS 表,以及使用 start_child 动态添加到监督树的“锁服务器”。理想情况下,我希望每个锁服务器都能直接处理与客户端的对话,但我担心当进程处于崩溃过程中时,获取/释放请求会通过调用或强制转换发出(因此不会响应)到消息)。

以 {local} 或 {global} 开头是行不通的,因为可以有 N 个。

最佳答案

诀窍是命名进程,而不是通过它的 pid 来引用它。您通常有 3 个可行的选择,

  • 使用注册名称。这就是 andreypopp 的建议。您通过注册名称引用服务器。 本地 注册名称必须是原子,这可能会在一定程度上限制您。 globally注册的名字没有这个限制,你可以注册任何term。

  • Supervisor 知道 Pid。问吧。您必须将 Supervisor Pid 传递给进程。

  • 或者,使用 gproc 应用程序(存在于 http://github.com 上)。它允许您创建一个通用流程注册表 - 您可以通过 ETS 来完成,但窃取好的代码而不是自己实现。

如果所有进程都是同一监督树的一部分,则 pid 可用。所以其中一个人的死亡意味着其他人的死亡。因此,Pids 回收无关紧要。

关于multithreading - transient gen_server 进程和更新 pids,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com