unregister
プロセスを停止しません。プロセス ID と指定されたアトムの間のバインディングを削除するだけです。
stop/0
関数は、gen_server 自体ではなく、この関数を呼び出したプロセスのコンテキストで実行されることを覚えておく必要があります。実際には (ほぼ) プロセスと対話する唯一の方法は、メッセージを送信することです。stop/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.
したがって、サーバーを停止するには、動作関数の 1 つから特別なタプルを返す必要があります。詳細については、こちらをご覧ください。もちろん、ビヘイビア関数の 1 つをトリガーするには、 または を使用してサーバーにメッセージを送信する必要がありますgen_server:cast
(gen_server:call
または、メッセージを送信して で処理しますhandle_info
)。何を使用するかはあなたの決定です。最後にterminate2
(アトムを含むタプルを返すコールバックに関係なく) が呼び出されstop
、状態のクリーンアップを行うことができます。
もちろん、terminate
コールバックでプロセスを登録解除できますが、プロセスが終了すると、登録解除は自動的に処理されます。