#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 обрабатывает сообщение? У меня есть следующие предположения:
- gen_server немедленно обработает сообщение и отправит сообщение на
handle_info
обратный вызов, но потеряет инициализированное состояние приinit
обратном вызове - gen_server сохраняет сообщение, если сервер не инициализирован, и отправляет сообщение после инициализации сервера.
Я хочу знать, как erlang или gen_server справляются с этой проблемой? каков принцип обработки сообщения?
Ответ №1:
Я предполагаю server is not initialised
, что вы имеете в виду остальную часть init
выполняемой функции. В этом случае ваше второе предположение верно. Гарантируется, что handle_info
оно будет выполнено после init
возврата. Поскольку gen_server
это один процесс, и вы уже выполняете init
, сообщения, отправленные самому init
себе, будут обрабатываться только gen_server
после init
завершения выполнения.