init/1
プロセスの関数gen_server
が初期化する必要があることを示すメッセージをプロセス自体に送信するというパターンを時折見てきました。これの目的は、gen_server
プロセスを生成するプロセスが待機する必要がないように、プロセス自体を非同期的に初期化することです。次に例を示します。
-module(test).
-compile(export_all).
init([]) ->
gen_server:cast(self(), init),
{ok, {}}.
handle_cast(init, {}) ->
io:format("initializing~n"),
{noreply, lists:sum(lists:seq(1,10000000))};
handle_cast(m, X) when is_integer(X) ->
io:format("got m. X: ~p~n", [X]),
{noreply, X}.
b() ->
receive P -> {} end,
gen_server:cast(P, m),
b().
test() ->
B = spawn(fun test:b/0),
{ok, A} = gen_server:start_link(test,[],[]),
B ! A.
init
このプロセスは、メッセージが他のメッセージよりも前に受信されることを前提としています。そうでない場合、クラッシュします。このプロセスがメッセージのm
前にinit
メッセージを取得することは可能ですか?
によって生成されたランダムな pid にメッセージを送信するプロセスがないと仮定しましょうlist_to_pid
。これを行うアプリケーションは、この質問に対する答えに関係なく、おそらくまったく機能しないからです。