отправить сообщение на gen_server перед инициализацией

#erlang #erlang-otp

#erlang #erlang-otp

Вопрос:

Я новичок в 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:

 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 справляются с этой проблемой? каков принцип обработки сообщения?

Ответ №1:

Я предполагаю server is not initialised , что вы имеете в виду остальную часть init выполняемой функции. В этом случае ваше второе предположение верно. Гарантируется, что handle_info оно будет выполнено после init возврата. Поскольку gen_server это один процесс, и вы уже выполняете init , сообщения, отправленные самому init себе, будут обрабатываться только gen_server после init завершения выполнения.