Erlang 如何通过ejabberd中的每个用户iq请求为gen_fsm创建pid

Erlang 如何通过ejabberd中的每个用户iq请求为gen_fsm创建pid,erlang,ejabberd,Erlang,Ejabberd,我正在使用gen_mod和gen_fsm。gen_mod正在处理所有iq请求,在一个案例中,我启动gen_fsm并维护该模块。若第一个用户发出iq请求,并创建gen_fsm模块pid,工作正常。但同时,我发送了另一个不同用户的iq,我从gen_fsm模块得到错误 {error,{ready_start,}。但有些人知道这是为什么第一个用户iq为gen_fsm生成pid,但第二个用户iq无法为该用户创建新的pid,因为该模块已经启动。我认为gen_fsm模块添加在主管下,因此每个用户都可以为gen

我正在使用gen_mod和gen_fsm。gen_mod正在处理所有iq请求,在一个案例中,我启动gen_fsm并维护该模块。若第一个用户发出iq请求,并创建gen_fsm模块pid,工作正常。但同时,我发送了另一个不同用户的iq,我从gen_fsm模块得到错误
{error,{ready_start,}
。但有些人知道这是为什么第一个用户iq为gen_fsm生成pid,但第二个用户iq无法为该用户创建新的pid,因为该模块已经启动。我认为gen_fsm模块添加在主管下,因此每个用户都可以为gen_fsm模块创建pid,并可以维护聊天。
请让我知道这种方式是正确的还是有其他方式?

听起来您正在使用注册名称启动每个
gen\u fsm
进程。这意味着启动另一个进程将导致与
已启动的
冲突并失败,因为该名称已被使用

如果未使用注册名称,则可以在不使用注册名称的情况下启动进程。您的代码可能有一行如下所示:

gen_fsm:start_link({local, ?SERVER}, my_module, [], [])
只需删除第一个参数:

gen_fsm:start_link(my_module, [], [])