【问题标题】:Timeout error in recursive call of handle_call/3 of behaviour(gen_server), Erlang/OTP行为(gen_server)的handle_call / 3递归调用超时错误,Erlang / OTP
【发布时间】:2017-01-13 16:03:18
【问题描述】:

我正在尝试在回复之前对 handle_call/3 进行递归调用。 但这似乎是不可能的,因为抛出了timeout 退出异常。 下面你可以看到代码和错误。

代码:

-module(test).
-behavior(gen_server).

%% API
-export([start_link/0,init/1,handle_info/2,first_call/1,second_call/1, handle_call/3, terminate/2]).

-record(state, {whatever}).

start_link() ->
  gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

init(_Args) ->
  {ok, #state{}}.

handle_info(Data, State) ->
  {noreply, State}.

% synchronous messages
handle_call(_Request, _From, State) ->
  case _Request of
    first_call ->
      {reply, data1, State};
    second_call ->
      {reply, {data2, first_call(self())}, State}
  end.

first_call(Pid) ->
  gen_server:call(Pid, first_call).

second_call(Pid) ->
  gen_server:call(Pid, second_call).

terminate(_Reason, _State) ->
  ok.

错误:

2> {_, PID} = test:start_link().
{ok,<0.64.0>}
3> test:second_call(PID).
** exception exit: {timeout,{gen_server,call,[<0.64.0>,second_call]}}
     in function  gen_server:call/2 (gen_server.erl, line 204) 

此行为的一个可能原因是 gen_server 无法处理递归调用,直到第一个调用完成(创建死锁)。这是正确的原因吗?如果是,为什么? 谢谢。

【问题讨论】:

    标签: recursion erlang erlang-otp gen-server


    【解决方案1】:

    是的,这就是原因。 gen_server 是一个单独的进程,当handle_call 正在执行时,它不会接收任何消息,也不会响应任何gen_server:call。因此first_call(self()) 超时。

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2014-05-12
      • 2010-11-24
      • 2018-10-14
      • 2014-10-01
      • 2019-07-17
      • 2011-08-15
      • 2015-12-15
      相关资源
      最近更新 更多