我目前正在做一个游戏服务器的项目。每个玩家都应该有自己的带有 gen_fsm 行为的进程。要使用 start/3 启动 gen_fsm,我们需要一个唯一的 atom,目前我们使用 make_ref() 并找到了一种方法来将此 ref 变成具有 ref_to_list/1 的 atom。但根据这篇文章,不建议这样做,我同意他的看法。
你将如何解决这个问题?当我们使用本地选项启动 gen_fsm 时,我们需要一个原子来识别它。
我目前正在做一个游戏服务器的项目。每个玩家都应该有自己的带有 gen_fsm 行为的进程。要使用 start/3 启动 gen_fsm,我们需要一个唯一的 atom,目前我们使用 make_ref() 并找到了一种方法来将此 ref 变成具有 ref_to_list/1 的 atom。但根据这篇文章,不建议这样做,我同意他的看法。
你将如何解决这个问题?当我们使用本地选项启动 gen_fsm 时,我们需要一个原子来识别它。
如果您使用gen_fsm:start/3
唯一需要的原子是回调模块名称。这样,您只需要跟踪将自动唯一的 PID(进程 ID)。
如果您稍后需要访问该gen_fsm
进程,请将 PID 保存在某种映射表中或命名该进程(如您所做的那样)。
也许我遗漏了一些东西,但听起来你最好的做法是不指定local
选项,即不给 gen_fsm 进程命名。
值得注意的是,erlang vm 实例可以使用的唯一原子的数量是有限的。所以生成大量随机原子可能是个坏主意。
您应该看到 gproc (https://github.com/esl/gproc) 创建进程注册表以将某些 erlang 术语与进程的 pid() 相关联。用唯一的 atom 注册每个启动的 gen_fsm 进程并不是一个好主意。