Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 在gen_服务器进程中是否可以通过其Pid调用函数_Erlang_Otp - Fatal编程技术网

Erlang 在gen_服务器进程中是否可以通过其Pid调用函数

Erlang 在gen_服务器进程中是否可以通过其Pid调用函数,erlang,otp,Erlang,Otp,如果我有一组名为lock的gen服务器,我可以调用一个函数吗 hello()-> io:format(“你好,世界!~n”)。 从该gen_服务器的各个进程的Pid,而不是通用的lock:hello()。 我尝试了Pid=(因此,当我在我的主管中启动chld时,Pid将返回),并且Pid:hello()。给出了一个糟糕的论据这是不可能的吗 发送消息而不是调用该函数是更好的主意吗???您可以在任何地方调用函数hello。如果从1000个进程调用它1000次,那么每个进程将并行执行函数,而不会相互干

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

hello()->
io:format(“你好,世界!~n”)。

从该gen_服务器的各个进程的Pid,而不是通用的
lock:hello()。

我尝试了
Pid=
(因此,当我在我的主管中启动chld时,Pid将返回),并且Pid:hello()。给出了一个糟糕的论据这是不可能的吗


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

您可以在任何地方调用函数
hello
。如果从1000个进程调用它1000次,那么每个进程将并行执行函数,而不会相互干扰。您只需从这些进程中的每一个进程调用它,就像调用一个在特定模块
lock
中定义并接受零参数的特定函数
hello


可能您的问题中没有提到什么?

您可以在任何地方调用函数
hello
。如果从1000个进程调用它1000次,那么每个进程将并行执行函数,而不会相互干扰。您只需从这些进程中的每一个进程调用它,就像调用一个在特定模块
lock
中定义并接受零参数的特定函数
hello


可能您的问题中没有提到什么?

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

Erlang中没有Pid:函数API

在这两种情况下,只要您使用gen_server API,调用gen server将序列化调用。但在函数调用中,您可以选择同步应答


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

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

Erlang中没有Pid:函数API

在这两种情况下,只要您使用gen_server API,调用gen server将序列化调用。但在函数调用中,您可以选择同步应答


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

当您调用gen_服务器模块中的函数时,该函数不会在gen_服务器进程中执行。它在调用进程中执行

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

例如,gen_server:call/2函数将接受一个pid和一条消息,该消息将与调用一起发送。gen_服务器将在gen_服务器进程中运行其handle_调用功能

通常情况下,您将在定义gen_服务器的同一模块中使用函数来执行gen_服务器:call,以便调用者不必在意。这为其他人创建了一个干净的API,并隐藏了gen_服务器特定的内容

把所有的部分放在一起可能有点棘手,但一旦你做到了,就很简单了。查看LYSE的这一章:

调用gen_服务器模块中的函数时,该函数不会在gen_服务器进程中执行。它在调用进程中执行

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

例如,gen_server:call/2函数将接受一个pid和一条消息,该消息将与调用一起发送。gen_服务器将在gen_服务器进程中运行其handle_调用功能

通常情况下,您将在定义gen_服务器的同一模块中使用函数来执行gen_服务器:call,以便调用者不必在意。这为其他人创建了一个干净的API,并隐藏了gen_服务器特定的内容

把所有的部分放在一起可能有点棘手,但一旦你做到了,就很简单了。查看LYSE的这一章:

-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}.