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
如果我有一组名为 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