如果我有一组名为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
,该函数不接受任何参数。
也许你的问题中有什么没有提到?