【问题标题】:send message to gen_server before init在初始化之前向 gen_server 发送消息
【发布时间】:2017-02-23 09:07:53
【问题描述】:

我是 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 回调中会丢失初始化状态

  2. gen_server 存储未初始化服务器的消息,并在服务器初始化后发送消息。

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

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    我猜server is not initialised 是指正在执行的init 函数的其余部分。在这种情况下,您的第二个猜测是正确的。保证handle_info 将在init 返回后执行。由于gen_server是一个单独的进程,并且你已经在执行init,所以从init发送给自己的消息只有在init执行完毕后才会被gen_server处理。

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多