据我了解,我应该通过发送消息将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, {}, {}}.
答案 0 :(得分:4)
您不能通过直接发送消息与gen_server
进行互动。您应该使用gen_server:call
或gen_server:cast
,如下所示:
Response = gen_server:call(Pid, {auth_user, {User, Password}})
call
/ cast
会处理将邮件发送到Pid
(并收到call
的响应)本身,以及许多边缘情况,例如之前崩溃的进程回应您的请求等。
当您想要在多个调用之间保存某些状态时,如果后者是正确的,那么为什么我需要一个这样的结构,如果我已经有一个导出的函数
auth_user
?
gen_server
非常有用。例如,如果要在应用程序内存中保留全局计数器的内存计数器,则应使用gen_server
,将计数器存储为状态,并生成cast
或{{在每个请求上1}}。如果您没有要保留的状态,则应使用正常功能。