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

Ser*_*rov 2 erlang

据我了解,我应该通过发送消息来用于异步请求,然后通过客户端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)

Dog*_*ert 5

您不会gen_server像这样直接发送消息来与 a 进行交互。你应该使用gen_server:callgen_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如果没有要保留的状态,则应该使用普通函数。