gen_server 进程中是否可以通过其 Pid 调用函数

Can a function be called in a gen_server process by its Pid

如果我有一组名为 lock 的 gen 服务器,我可以调用一个函数 say

hello() -> io:format("Hello, world!~n").

来自 gen_server 的各个进程的 Pid 而不是通用 lock:hello().

我尝试了 Pid=<0.91.0>(所以当我在我的主管中启动一个孩子时,Pid 是 return)和 Pid:hello()。给出一个错误的论据是不可能做到这一点吗??

发送消息而不是调用该函数是更好的主意吗??

您可以从任何地方调用函数 hello。如果您从 1000 个进程中调用它 1000 次,每个进程将并行执行该函数而不会相互干扰。您只需从这些进程中的每一个中这样调用它 lock:hello().,因此您调用了一个特定函数 hello,该函数在特定模块 lock 中定义并且采用零参数。

可能有些事情您在问题中没有提到?

您可以调用 gen_server:call(Pid, TuplePatternThatMatchesOnCallback)

-behaviour(gen_server).

%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
         terminate/2, code_change/3]).

...

hello() ->
  gen_server:call(Pid, hello).


handle_call(hello, _From, _State) ->
    Reply = io:format("Hello, world!~n")
    {reply, Reply, State}.

Erlang中没有Pid:FunctionAPI

在这两种情况下,如果您使用 gen_server API,调用 gen server 将序列化调用。但是使用函数调用你可以选择同步回复。

如果 hello 只是放在 gen_server 模块中(没有 gen_server:call),它将在调用进程的上下文中执行,而不是 gen_server 一个。

当您在 gen_server 模块中调用函数时,该函数不会在 gen_server 进程中执行。它在调用者进程中执行。

如果您希望 gen_server 进程执行某些操作,您应该使用 gen_server:call 或 gen_server:cast 函数:

例如,gen_server:call/2 函数将获取一个 pid 和一条将随调用一起发送的消息。 gen_server 将 运行 它是 gen_server 过程中的 handle_call 函数。

通常,您会在定义 gen_server 的同一模块中拥有函数,这些函数将执行 gen_server:call,这样调用者就不必关心了。这为其他人创造了一个干净的 API 并隐藏了 gen_server 特定的东西。

将所有部分组合在一起可能有点棘手,但一旦完成就很简单。查看 LYSE 的这一章: http://learnyousomeerlang.com/clients-and-servers