我偶尔会看到一种模式,其中进程的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
,因为无论这个问题的答案如何,任何这样做的应用程序都可能根本不起作用。