在初始化之前向 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如何处理该消息?我有以下猜测:
gen_server 立即处理消息,并将消息发送到 handle_info
回调,但会在 init
回调
[ 中丢失初始化状态=30=]
gen_server服务器未初始化时存储消息,服务器初始化后发送消息。
我想知道 erlang 或 gen_server 是如何处理这个问题的? handle message的原理是什么?
我猜 server is not initialised
是指正在执行的 init
函数的其余部分。在那种情况下,你的第二个猜测是正确的。保证 handle_info
将在 init
返回后执行。由于 gen_server
是单个进程,并且您已经在执行 init
,因此从 init
发送给它自己的消息只会在 [=11= 之后由 gen_server
处理] 执行完毕。
我是 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如何处理该消息?我有以下猜测:
gen_server 立即处理消息,并将消息发送到
[ 中丢失初始化状态=30=]handle_info
回调,但会在init
回调gen_server服务器未初始化时存储消息,服务器初始化后发送消息。
我想知道 erlang 或 gen_server 是如何处理这个问题的? handle message的原理是什么?
我猜 server is not initialised
是指正在执行的 init
函数的其余部分。在那种情况下,你的第二个猜测是正确的。保证 handle_info
将在 init
返回后执行。由于 gen_server
是单个进程,并且您已经在执行 init
,因此从 init
发送给它自己的消息只会在 [=11= 之后由 gen_server
处理] 执行完毕。