在初始化之前向 gen_server 发送消息

send message to gen_server before init

我是 erlang 的新手,我有以下代码:

-module (test_srv).
-behaviour (gen_server).
-export ([start_link/0, init/1, handle_info/2]).

start_link() ->
  gen_server:start_link(?MODULE, [], []).

init([]) ->
  self() ! asdasd,
  {ok, new_state}.

handle_info(Msg, State) ->
  io:format("server got ~p , now state is ~p~n", [Msg, State]),
  {noreply, State}.

我在erl中测试shell:

1> {_, P} = test_srv:start_link().
server got asdasd , now state is new_state

问题是,当服务器未初始化且未就绪时向服务器发送消息时,gen_server如何处理该消息?我有以下猜测:

  1. gen_server 立即处理消息,并将消息发送到 handle_info 回调,但会在 init 回调

    [ 中丢失初始化状态=30=]
  2. gen_server服务器未初始化时存储消息,服务器初始化后发送消息。

我想知道 erlang 或 gen_server 是如何处理这个问题的? handle message的原理是什么?

我猜 server is not initialised 是指正在执行的 init 函数的其余部分。在那种情况下,你的第二个猜测是正确的。保证 handle_info 将在 init 返回后执行。由于 gen_server 是单个进程,并且您已经在执行 init,因此从 init 发送给它自己的消息只会在 [=11= 之后由 gen_server 处理] 执行完毕。