gpt4 book ai didi

erlang - 进程字典适合这种情况吗?

转载 作者:行者123 更新时间:2023-12-02 11:35:28 30 4
gpt4 key购买 nike

我在这里和其他地方读到了一些评论,表明 Erlang 的进程字典是一个坏主意,应该消亡。通常,作为一个完全的 Erlang 新手,我会避免它。然而,在这种情况下,我的其他选择并不好。

我有一个主要的调度程序函数,如下所示:

dispatch(State) ->
receive
{cmd1, Params} ->
NewState = do_cmd1_stuff(Params, State),
dispatch(NewState);
{cmd2, Params} ->
NewState = do_cmd2_stuff(Params, State),
dispatch(NewState);
BadMsg ->
log_error(BadMsg),
dispatch(State)
end.

显然,我的名字对我来说更有意义,但这就是要点。在由 do_cmd2_stuff() 调用的函数调用的函数调用的函数深处,我想向所有用户发送消息,告诉他们我所做的事情。为此,我需要从发送消息的位置获取用户列表。用户列表不容易保持全局状态,因为这只是代表我操作的唯一数据 block 的一种数据结构。

在我看来,除了使用进程字典之外,我还有一些令人不快的选择。我可以通过所有各级功能将用户列表发送到进行广播的最底层功能。这很令人不快,因为它会导致我的所有函数都获得一个参数,无论它们是否真的关心它。

或者,我可以让所有 do_cmdN_stuff() 函数返回要发送的消息。但这也不是很好,因为发送消息可能不是我想做的最后一件事,而且它用一堆 {Msg, NewState} 元组弄乱了我的调度程序。此外,某些功能可能有时没有任何消息可发送。

就像我之前说的,我对 Erlang 很陌生。也许有更多经验的人可以给我指出更好的方法。有吗?进程字典适合这种情况吗?

最佳答案

一般规则是,如果您有疑问,则不应使用流程字典。

如果您提到的两个选项不够好(我个人喜欢您返回要发送的消息的选项),并且您想要的是一些特定的代码来跟踪用户并向他们转发消息,也许您可​​以这样做想要做的是有一个保存该信息的进程。

Pid ! {forward, Msg}

其中 Pid 将负责将所有内容发送到一堆其他进程。现在,您仍然需要传递 Pid,除非您在某个注册表中给它一个名称来查找它。使用 register/2globalgproc

关于erlang - 进程字典适合这种情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073670/

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