在gen_server进程中,函数的Pid是否可以调用它



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

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

来自该代服务器的单个进程的Pid,而不是通用lock:hello().

我尝试了Pid=<0.91.0>(所以当我在主管中启动chld时,Pid会返回),并且Pid:hello()。给出了一个糟糕的论点,这是不可能的吗??

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

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

-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:Function API。

在这两种情况下,如果您使用的是gen_server API,那么调用gen服务器将序列化调用。但是使用函数调用时,您可以选择同步回复。

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

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

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

例如,gen_server:call/2函数将获取一个pid和一条消息,该消息将与调用一起发送。然后,gen_server将在gen_server进程中运行它的handle_call函数。

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

把所有的部分放在一起可能有点棘手,但一旦你做到了,就很简单了。查看LYSE的本章:http://learnyousomeerlang.com/clients-and-servers

您可以从任意位置调用函数hello。如果从1000个进程中调用它1000次,则每个进程将并行执行该函数,而不会相互干扰。您只需从这些进程中的每一个调用类似lock:hello().的函数,就可以调用在特定模块lock中定义的特定函数hello,该函数不接受任何参数。

也许你的问题中有什么没有提到?

最新更新