Erlang 中 gen_fsm:start/3 的唯一原子

Posted

技术标签:

【中文标题】Erlang 中 gen_fsm:start/3 的唯一原子【英文标题】:Unique atom for gen_fsm:start/3 in Erlang 【发布时间】:2011-08-16 23:52:39 【问题描述】:

我目前正在做一个游戏服务器的项目。每个玩家都应该有自己的带有 gen_fsm 行为的进程。要使用 start/3 启动 gen_fsm,我们需要一个唯一的 atom,目前我们使用 make_ref() 并且已经找到了一种方法可以使用 ref_to_list/1 将此 ref 变成一个 atom。但根据this post 不建议这样做,我同意他的看法。

你会如何解决这个问题?当我们使用本地选项启动 gen_fsm 时,我们需要一个原子来识别它。

【问题讨论】:

【参考方案1】:

如果你使用gen_fsm:start/3,你唯一需要的就是回调模块名。这样你只需要跟踪一个 PID(进程 ID),它会自动唯一。

如果您稍后需要访问gen_fsm 进程,请将 PID 保存在某种映射表中或命名进程(如您所做的那样)。

【讨论】:

谢谢,我错过了这样一个事实.【参考方案2】:

也许我遗漏了一些东西,但听起来你最好的做法是不指定 local 选项,即不给 gen_fsm 进程命名。

值得注意的是,有一个limit to the number of unique atoms 可供erlang vm 的实例使用。所以生成大量随机原子可能是个坏主意。

【讨论】:

【参考方案3】:

您应该看到 gproc (https://github.com/esl/gproc) 创建进程注册表,用于将一些 erlang 术语与进程的 pid() 关联。用唯一的 atom 注册每个启动的 gen_fsm 进程并不是一个好主意。

【讨论】:

以上是关于Erlang 中 gen_fsm:start/3 的唯一原子的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Erlang shell 中运行 Erlang 应用程序

Erlang 错误处理

如何使用 erlang 插件在 vscode 中调试 rebar3 erlang?

C 和 Erlang:Erlang 端口示例

如何连接到已注册的节点(Erlang)并从另一个 erlang 应用程序中使用它

[Erlang]怎样在Erlang中使用SSL