据我了解,我应该通过发送消息来用于异步请求,然后通过客户端handle_cast
对响应做出反应。receive..end
这是一个例子:
Pid ! {auth_user, {User, Password}}.
Run Code Online (Sandbox Code Playgroud)
对于同步请求,当我想等待gen_server
发送响应时,我必须从模块中显式调用相应的函数,如下所示:
{ok, Result} = auth_server:auth_user({User, Password}).
Run Code Online (Sandbox Code Playgroud)
上面的说法是否正确?
如果后者是正确的,如果我已经有一个导出函数,为什么我需要这样的构造auth_user
?
handle_call({authenticate_user, {Login, Password}}, _From, _) ->
{reply, {}, {}}.
Run Code Online (Sandbox Code Playgroud)
您不会gen_server
像这样直接发送消息来与 a 进行交互。你应该使用gen_server:call
或gen_server:cast
像这样:
Response = gen_server:call(Pid, {auth_user, {User, Password}})
Run Code Online (Sandbox Code Playgroud)
call
/cast
将处理向 本身发送消息Pid
(并接收 的响应call
),以及许多边缘情况,例如在响应您的请求之前进程崩溃等。
如果后者是正确的,如果我已经有一个导出函数,为什么我需要这样的构造
auth_user
?
gen_server
当您想在多个调用之间存储某些状态时非常有用。例如,如果您想在内存中保存应用程序页面浏览量的全局计数器,您应该使用gen_server
,将计数器存储为 的状态,并在每个请求上对其进行cast
或操作。call
如果没有要保留的状态,则应该使用普通函数。
归档时间: |
|
查看次数: |
1557 次 |
最近记录: |