私はErlangの新しい学習者です。Erlang変数のライフサイクルについて質問があります。 Erlang gen_server comunicationgen_serverの状態ライフサイクルは何ですか
-module(wy).
-compile(export_all).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-behaviour(gen_server).
-record(state, {id ,m, succ, pred}).
start(Name, M) ->
gen_server:start_link({local, Name}, ?MODULE, [Name, M], []).
init([Name, M]) ->
{ok, #state{id = Name, m = M}}.
handle_call({get_server_info}, _Frome, State) ->
{reply, State, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
get_server_info(ServerName) ->
gen_server:call(ServerName, {get_server_info}).
から
リファレンス変数 "状態" のライフサイクルとは何ですか?
変数「状態」がhandle_callおよびhandle_castから再利用されていることがわかります。まず、これらの "State"はinit()関数"#state{id = Name, m = M}"
から初期化されたものと同じですか?
もしそうなら、この "状態"はグローバル変数ですか?この "状態"はいつ破壊されるのでしょうか?
Erlangにはグローバル変数がありますか?
ありがとう、Brujo。私はもう1つのフォローアップの質問があります。コール、キャスト、情報、状態を異なるプロセスから同時に設定すると、状態は異なるプロセスのすべての変更をキャプチャしますか? cast()が値AをStateに設定すると同時に、別のcast()は値BをStateに設定します。その前にStateは空です。値の設定後、State、A、B、またはABのどちらに保存されますか? @Brujo Benavides – Neil
ええ、私のコードで見ることができるように、たとえメッセージがサーバーに非同期で到達したとしても、ループはその時に1つのみを処理し、各コールバックの評価は同期的です(つまり、何かが返されるまで'handle_ *'から)。 また、明白にするために、 'gen_server:cast/2'は状態を設定せず、サーバプロセスにのみメッセージを送信します。この例では、 'cast(Server、Msg) - > Serverのように見えます。 {cast、Msg}。 そのメッセージは 'loop'内で受信され、' Mod:handle_cast/2'が評価されるときです。 –