现在我正在玩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 ...
答案 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并在其中包含时间转换。