Server 由于erlang中的超时,如何触发句柄信息?

Server 由于erlang中的超时,如何触发句柄信息?,server,erlang,timeout,otp,Server,Erlang,Timeout,Otp,我正在使用gen_服务器行为,并试图了解如何从handle_调用中发生的超时触发handle_信息/2,例如: -module(server). -export([init/1,handle_call/3,handle_info/2,terminate/2). -export([start/0,stop/0]). init(Data)-> {ok,33}. start()-> gen_server:start_link(?MODULE,?MODULE,[]). sto

我正在使用gen_服务器行为,并试图了解如何从
handle_调用中发生的
超时触发
handle_信息/2
,例如:

-module(server).
-export([init/1,handle_call/3,handle_info/2,terminate/2).
-export([start/0,stop/0]).

init(Data)->
    {ok,33}.
start()->
   gen_server:start_link(?MODULE,?MODULE,[]).
stop(Pid)->
   gen_server:stop(Pid).

handle_call(Request,From,State)->
     Return={reply,State,State,5000},
     Return.

handle_info(Request,State)->
    {stop,Reason,State}.

terminate(Reason,State)->
    {ok,S}=file:file_open("D:/Erlang/Supervisor/err.txt",[read,write]),
    io:format(S,"~s~n",[Reason]),
    ok.
我想做什么

我希望如果我启动服务器并且在
5
秒内不使用
gen\u server:call/2
(在我的情况下),那么
handle\u info
将被调用,这将反过来发出
stop
,从而调用
terminate
。 我看到它不是这样发生的,事实上,
handle\u info
根本没有被调用

在我看到的示例中,在
init/1
的返回中设置了
timeout


我可以推断,只有当我初始化服务器并且不发出任何命令(或
cast
call
等待
N
秒)时,才会触发
handle\u info
。如果是,为什么我可以在和的
返回中提供
超时

更新

我试图获得以下功能:

  • 如果在
    X
    秒内未发出
    呼叫
    ,则触发
    句柄信息/2

  • 如果在
    Y
    秒内未发出
    cast
    ,则触发
    handle\u info/2
  • 我想这个超时可以在
    handle\u call
    handle\u cast
    return
    中设置:

    {reply,Reply,State,X} //for call
    {noreply,State,Y}   //for cast
    

    如果没有,这些超时是何时触发的,因为它们是
    返回的

    要从回调启动超时处理,必须首先调用此回调。您的
    Return={reply,State,State,5000},
    根本不执行

    相反,如果您想“启动服务器并且在5秒钟内不使用
    gen\u server:call/2
    ,那么将调用
    handle\u info/2
    ”,您可以从回调返回
    {ok,State,Timeout}
    元组

    init(数据)->
    {好的,335000}。
    

    不能为不同的呼叫和强制转换设置不同的超时。正如Alexey Romanov在评论中所述

    对于不同类型的消息有不同的超时不是任何
    gen.*
    行为所能做到的,必须通过将它们保持在状态中来模拟



    如果从任何
    handle\u call/3
    /
    handle\u cast/2
    返回
    {reply,State,Timeout}
    元组,如果此进程的邮箱在
    Timeout

    之后为空,则会触发超时。我建议您阅读源代码:gen\u server.erl

    % gen_server.erl 
    % line 400
    loop(Parent, Name, State, Mod, Time, HibernateAfterTimeout, Debug) ->
      Msg = receive
              Input ->
                Input
            after Time ->
          timeout
            end,
      decode_msg(Msg, Parent, Name, State, Mod, Time, HibernateAfterTimeout, Debug, false).
    

    它可以帮助您理解参数Timeout

    我不理解。如果我在
    init/1
    return中设置了超时,这是否意味着如果我不调用任何东西(在给定的时间间隔内调用或强制转换),它将被触发?如果我希望不调用
    call
    cast
    的超时时间不同,例如:
    5000
    不调用
    call
    3000
    不调用
    cast
    ,该怎么办?还有一次,我使用了
    call
    ,它进入
    handle\u call
    超时何时触发?如果打电话的人在给定的超时时间内没有得到回复,或者如何得到回复?我认为这对他的要求不起作用(如果我理解正确的话)。取而代之的是,根据稍后处理的
    调用
    转换
    中的哪一个,将使用其中一个超时。对于不同类型的消息有不同的超时不是任何
    gen.*
    行为所能做的,必须通过将它们保持在状态中来模拟。如果从任何
    handle\u call/3
    /
    handle\u cast/2
    返回
    {reply,state,Timeout}
    元组,如果此进程的邮箱在
    timeout
    handle\u info/2
    with
    Request=timeout之后为空,则会触发超时。如果此
    gen\u服务器在超时时间内未收到任何消息,则VM将调用
    。什么“前述”情景
    {reply,reply,State,Timeout}
    handle\u call/3
    返回的内容,之后可能不会调用任何内容。如果从
    call/2
    /
    cast/2
    返回任何
    {{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(阅读:没有
    call
    /
    cast
    /
    与此
    gen\u服务器一起发出
    作为收件人,VM将向其发送一条消息
    timeout
    ,该消息可能由
    句柄信息(超时,状态)
    处理。