Erlang:为什么取消注册进程ID后我的进程仍在运行?

ned*_*wed 1 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 whereis(sts) of
     undefined -> 
        already_stopped;
     _ ->
        unregister(sts),
        stopped,
  end.
Run Code Online (Sandbox Code Playgroud)

Sou*_*lls 5

使用注销并不会停止该过程。但是,停止进程不会取消注册。因此,与其在此处使用注销,不如使用erlang:exit/2

stop() ->
    case whereis(sts) of
        undefined -> 
            already_stopped;
        Pid -> 
            exit(Pid, normal), % Use whatever exit reason you want
            stopped
     end.
Run Code Online (Sandbox Code Playgroud)

话虽如此,您实际上应该使用OTP流程行为(例如gen_server),因为它们使流程管理更加容易。使用OTP流程,您可以改为call使流程停止并告诉它停止,这样,当您收到答复时,该流程已经停止。否则,您的退出消息可能需要一些时间才能通过。