我有gen_server:
start(UserName) ->
case gen_server:start({global, UserName}, player, [], []) of
{ok, _} ->
io:format("Player: " ++ UserName ++ " started");
{error, Error} ->
Error
end
...
Run Code Online (Sandbox Code Playgroud)
现在我想写函数来停止这个gen服务器.我有:
stop(UserName) ->
gen_server:cast(UserName, stop).
handle_cast(stop, State) ->
{stop, normal, State};
handle_cast(_Msg, State) ->
{noreply, State}.
Run Code Online (Sandbox Code Playgroud)
我跑了:
start("shk").
Player: shk startedok
stop(shk).
ok
start("shk").
{already_started,<0.268.0>}
Run Code Online (Sandbox Code Playgroud)
但:
stop(player).
ok
Run Code Online (Sandbox Code Playgroud)
是工作.
如何按名称运行gen_server并按名称停止?
谢谢.
knu*_*tin 13
第一:您必须始终使用相同的名称来处理进程,"foo"并且foo它们是不同的,因此首先要有严格的命名约定.
第二:使用全局注册的流程时,还需要使用{global, Name}寻址流程.
在我看来,你还应该转换stop使用的函数gen_server:call,它将阻止并让你从gen_server返回一个值.一个例子:
stop(Name) ->
gen_server:call({global, Name}, stop).
handle_call(stop, _From, State) ->
{stop, normal, shutdown_ok, State}
Run Code Online (Sandbox Code Playgroud)
这将返回shutdown_ok给调用者.
有了这个说法,该global模块相当有限,并且类似的替代方案gproc提供了更好的分发.