在Erlang中,消息发送者是否可以等待响应?

在Erlang中,消息发送者是否可以等待响应?,erlang,pid,actor,Erlang,Pid,Actor,在Erlang中,消息发送者是否有任何方式可以等待响应,从而只在处理完消息后才继续执行 我的意思是这样的: Actor ! DoSomething Continue to this next line of code when DoSomething has been processed 我知道可以通过发送发送者的Pid来进行回调,但是还有其他等待方式吗?您可以使用接收块: 从文件中读取: 接收永远不会失败。执行是 暂停,可能无限期, 直到收到一条消息 将其中一种图案与 真正的保护序列 换句

在Erlang中,消息发送者是否有任何方式可以等待响应,从而只在处理完消息后才继续执行

我的意思是这样的:

Actor ! DoSomething
Continue to this next line of code when DoSomething has been processed
我知道可以通过发送发送者的Pid来进行回调,但是还有其他等待方式吗?

您可以使用接收块:

从文件中读取:

接收永远不会失败。执行是 暂停,可能无限期, 直到收到一条消息 将其中一种图案与 真正的保护序列


换句话说,发送消息并等待答复。

如果接收过程是a,则可以使用
gen\u server:call
。例如:

gen_server:call(Pid, Message),
% At this point, we know that the other process has answered.

首先要了解的是,Erlang是为处理异步消息传递而构建的。因此,实现同步消息传递的唯一方法是实现类似于确认的东西

想象两个过程,P1和P2。P1可能运行以下代码:

%% process P1 takes the Pid of P2 as a parameter
%% and a Message to pass on to P2
p1(P2, Message) ->
    P2 ! {self(), Message},
    receive
        {P2, ok}
    after 5000 -> % this section is optional, times out after 5s
        exit("P2 didn't process this!") % this kills P1
    end.
P2,则可能只运行以下命令:

p2() ->
    receive
        {From, Message} ->
            io:format("P2 received message ~p~n",[Message]),
            %% processing is done!
            From ! {self(), ok}
    end.
因此,您可能会生成p2作为一个新进程。这个人会坐着等待任何消息。然后,当您调用p1时,它会向P2发送一条消息,然后P2会处理该消息(
io:format/2
)并回复p1。由于P1正在等待答复,因此该进程内没有运行其他代码


这是实现阻塞调用的基本且唯一的方法。使用
gen_server:call
的建议大致实现了我刚才展示的内容。不过,它对程序员是隐藏的。

只是取决于杜邦的情况。如果web浏览器向webmachine请求某些长时间运行的erlang资源,则无法使用强制转换来满足该请求。

不,只有异步消息传递


如果你想有点哲理性,那么很难自动定义消息处理的时间。是消息到达流程、已接收但尚未对其采取行动时,还是在接收流程对其采取行动时。这类似于当有人“阅读”我的邮件时自动收到通知。是的,他们看到了,但他们真的读过吗?

…你为什么要这样?难道它不能击败Erlang的全部目的吗?你真的应该考虑阅读文档和实验,而不是用你觉得迷惑的东西来淹没StAdvExcel。OTP设计原则文档中包含了这一点。如果你没有使用OTP设计原则,那是因为你对erlang非常了解,不会问这样的问题。Dustin,你可能会觉得这很难相信,但不是每个人都像你一样聪明。也许我们也需要smartoverflow.com:)@Zubair,这与聪明无关。这是关于尝试自己,而不是利用别人的时间。几乎所有的问题都可以在50秒和10秒的思考过程中通过谷歌搜索到。请不要再提这样的问题了,因为你不想自己做你的工作。我不知道该说什么。我在谷歌上搜索并尝试研究答案。我想你是对的,但你必须记住,我不是一个技术型的人,所以你可能从网上文档中了解到的东西对99.99%的人来说完全是胡言乱语,不幸的是,我是99.99%的人中的一员。我知道StackOverflow只有600万会员,也许他们都是顶尖的00.01%的技术人员。也许我是这个网站的错误用户。但我也会问,是否有一个像我这样技术比你差很多的人的网站?希望有一个暂停;-)这不是发送Pid并在接收中等待吗?这不就是一个回调吗?我自己也不太清楚,谁能帮我解释一下。@Zubair:如果你说我“你好”,你会等我的“你好”,我回答“你好!”。有回电吗?这就是Erlang的工作原理。只是进程和消息。你是过程,我是过程。你发短信,我发短信。我收到,你收到。这里没有回电。好的,谢谢@Hynek。我想我误解了回调是什么。我很好奇有多少真实世界的应用程序是用这种技术构建的。@jldupont。你问了一个合理的问题,我不知道答案是什么。不过我要说的是:如果您要在Erlang上构建一个非平凡的系统,那么您可能应该使用OTP,从而使用gen_server:call()。如果你不使用OTP,那么你要么重新发明一些OTP为你做的事情,要么以一种不发挥Erlang优势的方式编写代码。。。在这种情况下,您可能首先应该使用另一种语言。@蒂姆:更确切地说:我很好奇
genu服务器:call()
与异步
genu服务器:cast()
相比有多流行。
call
可以用于代理任何类型的资源,控制服务器的状态,从服务器请求数据,基于服务器的负载调节,…gen_server:call的最大优点是,您可以通过立即返回noreply来阻止调用方,同时通过生成一个进程来处理调用并从那里返回应答来保持并行性。尝试用java(轻松地)实现这一点。很抱歉最后的评论,但我想自己把它拿出来,并向这个小小的金色图案erlang(公平地说是OTP)免费提供给我表示敬意。。。