在Akka中,有两种不同的发送机制:! (告诉演员的内容)和? (询问演员的内容),对于那些不熟悉的人来说,主要的区别是actor ! message是一种火灾和遗忘操作,actor ? message返回一个结果的承诺,然后在稍后的时间需要解决。
在Erlang中,我还没有发现任何关于搜索"Erlang操作“或简单的"Erlang”的搜索结果。
发布于 2016-02-18 23:25:21
不,它没有,但是您所要求的很容易实现:
ask(Pid, M) ->
Promise = erlang:monitor(process, Pid),
Pid ! {ask, Promise, M},
Promise.等待承诺的结果现在可以通过以下方式完成:
force(Promise, Timeout) ->
receive
{result, Promise, R} ->
erlang:demonitor(Promise, [flush]),
{ok, R};
{'DOWN', Promise, process, _, Reason} ->
{error, {callee_died, Reason}}
after Timeout -> {error, timeout}
end.如果您不想在请求和强制之间做任何事情,那么您可以使用OTP行为gen_server,它有一个gen_server:call/3,本质上是一次实现这两个函数。
请注意,在上面,我们如何请求目标Pid上的监视器引用,这允许我们监视它是否死亡。我们还将此引用作为承诺的唯一标记,以便在邮箱中的其他消息中找到它。
发布于 2016-02-19 00:33:40
二郎不支持承诺,也不支持未来。有关模拟它们的其他示例,请参见这个问题。还请参阅这篇文章,以了解Erlang为什么使用消息传递而不是承诺和未来。
发布于 2016-03-20 20:55:10
Akka中的?是使用!构建的。它所做的是:创建一个新的临时参与者,它用作使用普通sender发送的消息的!。如果它没有及时收到任何东西,它就会把承诺设定为失败。如果它做到了,它就会兑现诺言。
然后,被问到的参与者将回复该临时参与者(这就是您如何知道实际回复了哪条消息,否则您必须自己在地图或类似的地方跟踪该消息)。
这就是为什么您必须显式导入ask模式的原因,以及为什么它被称为模式,而不是像!那样的内置原语。
您可以在Erlang中实现相同的模式。
https://stackoverflow.com/questions/35494277
复制相似问题