如何在Erlang gen_server中使用handle_cast和handle_call?

时间:2016-08-15 06:55:18

标签: erlang

据我了解,我应该通过发送消息将handle_cast用于异步请求,然后通过客户端receive..end对响应做出反应。

以下是一个例子:

Pid ! {auth_user, {User, Password}}.

对于同步请求,当我想在gen_server发送响应时等待时,我必须从模块中显式调用相应的函数,如下所示:

{ok, Result} = auth_server:auth_user({User, Password}).

上述陈述是否正确?

如果后者是正确的,那么为什么我需要一个这样的结构,如果我已经有一个导出的函数auth_user

handle_call({authenticate_user, {Login, Password}}, _From, _) ->
    {reply, {}, {}}.

1 个答案:

答案 0 :(得分:4)

您不能通过直接发送消息与gen_server进行互动。您应该使用gen_server:callgen_server:cast,如下所示:

Response = gen_server:call(Pid, {auth_user, {User, Password}})

call / cast会处理将邮件发送到Pid(并收到call的响应)本身,以及许多边缘情况,例如之前崩溃的进程回应您的请求等。

  

如果后者是正确的,那么为什么我需要一个这样的结构,如果我已经有一个导出的函数auth_user

当您想要在多个调用之间保存某些状态时,

gen_server非常有用。例如,如果要在应用程序内存中保留全局计数器的内存计数器,则应使用gen_server,将计数器存储为状态,并生成cast或{{在每个请求上1}}。如果您没有要保留的状态,则应使用正常功能。