Erlang:为什么我的进程在注销进程ID后仍在运行?
即使我注销了sts,我生成的进程也不会停止。如何停止不使用gen_serverErlang:为什么我的进程在注销进程ID后仍在运行?,erlang,server,Erlang,Server,即使我注销了sts,我生成的进程也不会停止。如何停止不使用gen_server start() -> case whereis(sts) of undefined -> PidA = spawn(dist_erlang, init,[]), register(sts, PidA), {ok,PidA}; _ -> {ok,whereis(sts)} end. stop() -> case wh
start() ->
case whereis(sts) of
undefined ->
PidA = spawn(dist_erlang, init,[]),
register(sts, PidA),
{ok,PidA};
_ ->
{ok,whereis(sts)}
end.
stop() ->
case whereis(sts) of
undefined ->
already_stopped;
_ ->
unregister(sts),
stopped,
end.
使用“取消注册”不会停止进程。但是,停止进程会注销它。因此,不要在这里使用unregister,而是使用erlang:exit/2
综上所述,您真的应该使用OTP流程行为,如gen_server,因为它们使流程管理更加容易。对于OTP进程,您可以调用该进程并告诉它停止,这样当您收到答复时,它就已经停止了。否则,退出消息可能需要一些时间才能通过。使用“取消注册”不会停止该过程。但是,停止进程会注销它。因此,不要在这里使用unregister,而是使用erlang:exit/2 综上所述,您真的应该使用OTP流程行为,如gen_server,因为它们使流程管理更加容易。对于OTP进程,您可以调用该进程并告诉它停止,这样当您收到答复时,它就已经停止了。否则,退出消息可能需要一些时间才能通过。取消注册不会停止此过程。它只是删除进程id和给定原子之间的绑定 您需要记住,stop/0函数是在调用该函数的进程的上下文中运行的,而不是gen_服务器本身。实际上,与某个进程交互的几乎唯一方法就是向它发送消息。因此,您可以像这样实现停止/0功能:
%% send stop message to `sts` server
stop() ->
gen_server:cast(sts, stop).
%% [...]
handle_cast( OtherCastMessages, State) ->
%% handel other cast messages ;
%% [...] ;
%% handle stop message
handle_cast( _Message = stop, State) ->
{stop,
_Reason = normal,
State}. % return result that stops server
%% [...]
terminate(_Reason = normal, State) ->
%% could do some cleanup in this callback
ok.
所以要停止服务器,必须从一个行为函数返回特殊的元组。你可以阅读更多关于这方面的内容。当然,触发一个行为函数,您必须使用gen_server:cast或gen_server:call向您的服务器发送消息,或者只发送消息并使用handle_info进行处理。使用什么是你的决定。最后调用terminate2,不管哪个回调使用stop atom返回元组,您都可以对状态进行清理
当然,您可以在terminate回调中注销您的进程,但当进程终止时,注销将自动处理 取消注册不会停止进程。它只是删除进程id和给定原子之间的绑定
您需要记住,stop/0函数是在调用该函数的进程的上下文中运行的,而不是gen_服务器本身。实际上,与某个进程交互的几乎唯一方法就是向它发送消息。因此,您可以像这样实现停止/0功能:
%% send stop message to `sts` server
stop() ->
gen_server:cast(sts, stop).
%% [...]
handle_cast( OtherCastMessages, State) ->
%% handel other cast messages ;
%% [...] ;
%% handle stop message
handle_cast( _Message = stop, State) ->
{stop,
_Reason = normal,
State}. % return result that stops server
%% [...]
terminate(_Reason = normal, State) ->
%% could do some cleanup in this callback
ok.
所以要停止服务器,必须从一个行为函数返回特殊的元组。你可以阅读更多关于这方面的内容。当然,触发一个行为函数,您必须使用gen_server:cast或gen_server:call向您的服务器发送消息,或者只发送消息并使用handle_info进行处理。使用什么是你的决定。最后调用terminate2,不管哪个回调使用stop atom返回元组,您都可以对状态进行清理
当然,您可以在terminate回调中注销您的进程,但当进程终止时,注销将自动处理 这是学校作业,我根本不允许使用gen_服务器。这是学校作业,我根本不允许使用gen_服务器。