为什么我的 gen_server 实现会超时?
Why does my gen_server implementation give a timeout?
我正在尝试学习 Erlang 和 OTP,所以我目前正在尝试掌握 gen_server
。
我写了一个快速的 gen_server 实现:
-module(test).
-behavior(gen_server).
%% API
-export([start/0, add/1]).
-export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2]).
start() -> gen_server:start_link(?MODULE, [], []).
add(Value) -> gen_server:call(self(), {add, Value}).
%% Gen_Server
init(_Arguments) -> {ok, []}.
terminate(_Reason, _State) -> ok.
code_change(_PreviousVersion, State, _) -> {ok, State}.
handle_call({add, Value}, _From, State) -> {reply, ok, [Value|State]}.
handle_cast(_Arg0, State) -> {noreply, State}.
handle_info(Info, State) -> io:format("Unexpected message: ~p~n",[Info]), {noreply, State}.
问题是 add/1
调用超时而不是返回正常:
1> {ok, Pid} = test:start().
{ok,<0.33.0>}
2> Pid ! abc.
Unexpected message: abc
abc
3> test:add(3).
** exception exit: {timeout,{gen_server,call,[<0.31.0>,{add,3}]}}
in function gen_server:call/2 (gen_server.erl, line 204)
4> Pid ! abc.
abc
我做错了什么?当我 运行 gen_server:call/2
.
时,服务器似乎不再 运行ning
您传入 self()
作为 test:add
中 gen_server 的 pid,这是不正确的。 self()
将评估您在调用时所在的 REPL 进程的 pid。
您可以简单地将 gen_server pid 作为参数添加到 test:add
,因为您是从 test:start()
.
获取它的
我正在尝试学习 Erlang 和 OTP,所以我目前正在尝试掌握 gen_server
。
我写了一个快速的 gen_server 实现:
-module(test).
-behavior(gen_server).
%% API
-export([start/0, add/1]).
-export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2]).
start() -> gen_server:start_link(?MODULE, [], []).
add(Value) -> gen_server:call(self(), {add, Value}).
%% Gen_Server
init(_Arguments) -> {ok, []}.
terminate(_Reason, _State) -> ok.
code_change(_PreviousVersion, State, _) -> {ok, State}.
handle_call({add, Value}, _From, State) -> {reply, ok, [Value|State]}.
handle_cast(_Arg0, State) -> {noreply, State}.
handle_info(Info, State) -> io:format("Unexpected message: ~p~n",[Info]), {noreply, State}.
问题是 add/1
调用超时而不是返回正常:
1> {ok, Pid} = test:start().
{ok,<0.33.0>}
2> Pid ! abc.
Unexpected message: abc
abc
3> test:add(3).
** exception exit: {timeout,{gen_server,call,[<0.31.0>,{add,3}]}}
in function gen_server:call/2 (gen_server.erl, line 204)
4> Pid ! abc.
abc
我做错了什么?当我 运行 gen_server:call/2
.
您传入 self()
作为 test:add
中 gen_server 的 pid,这是不正确的。 self()
将评估您在调用时所在的 REPL 进程的 pid。
您可以简单地将 gen_server pid 作为参数添加到 test:add
,因为您是从 test:start()
.