gen_server:call - 如何发送消息

时间:2017-01-13 12:19:16

标签: erlang otp gen-server

现在我正在玩gen_server

我有两个模块 - 一个是Gen Server mod,第二个是逻辑模块

并希望通过gen_server将消息发送到PID:call

这是代码片段:

lookup_by_date(FromTime, ToTime) ->
    gen_server:call({global, ?MODULE}, {lookup_by_date,FromTime,ToTime}).

这里是handle_call func:

handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) ->
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime),
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime),
    Pid = spawn(fun()-> logic:handler() end),
    {reply, Pid !{lookup_by_date, FromSec, ToSec}, _State};

a和逻辑mod代码:

lookup_by_date(FromTime, ToTime) -> lookup_by_date(FromTime, ToTime, ets:first(auth), []).
lookup_by_date(_FromTime, _ToTime, '$end_of_table', Acc) -> {reply, Acc, ok};
lookup_by_date(FromTime, ToTime, Key, Acc) ->
    case ets:lookup(auth, Key) of
        [{Login, Pass, TTL, Unix, Unix2}] ->
            F = calendar:datetime_to_gregorian_seconds(Unix2),
        T = calendar:datetime_to_gregorian_seconds(Unix2),
        if
            F >= FromTime, T =< ToTime -> NewAcc = [{Login, Pass, TTL, Unix, Unix2}|Acc],
        N = ets:next(auth, Key),
            lookup_by_date(FromTime, ToTime, N, NewAcc);
        true -> N = ets:next(auth, Key),
                    lookup_by_date(FromTime, ToTime, N, Acc)
         end
        end.

handler() ->
  receive
      {lookup_by_date, FromTime, ToTime}->
          lookup_by_date(FromTime, ToTime),
            handler();
      Other->
        io:format("Error message for ~p~n" ,[Other]),
      handler()
  end.

但我收到错误(实际上不是错误)

2 - ; C(cache_server)。

【OK,cache_server}

3&GT; C(逻辑)。

{确定,逻辑}

4&GT; cache_server:start([{ttl,15000}])。

{确定,&LT; 0.73.0&GT;}

5个cache_server:insert(test,root,15000)。

{AUTH,测试,根,15000,1484309726435,       {{2017,1,13},{14,15,11}}}

6个cache_server:lookup_by_date({{2017,1,13},{14,15,11}},{{2017,1,13},{14,15,11}})

{lookup_by_date,63651536111,63651536111}

我从 - {reply,Pid!{lookup_by_date,FromSec,ToSec},_State}接收数据;

但是没有从“logic:lookup_by_date”函数

接收数据

无论如何,你告诉我正确的方向,因为我卡住了一点点。 THX ...

1 个答案:

答案 0 :(得分:2)

在您的代码中,对gen_server调用的回复是:

var a = foo().Skip(1)

在Erlang中,消息是异步的,它们只是发送到进程,因此这段代码不会等待响应,它只是立即返回您发送的消息。这就是你得到答复的原因Pid !{lookup_by_date, FromSec, ToSec}

在您的情况下,您不必生成进程,只需调用lookup_by_date函数:

{lookup_by_date, FromSec, ToSec}

注意:您的gen_server不使用结果,请求不会修改其状态,因此您可以直接调用函数lookup_by_date并在其中包含时间转换。