Erlang是否支持;询问;活动
在Akka中有两种不同的发送机制:Erlang是否支持;询问;活动,erlang,promise,akka,actor,Erlang,Promise,Akka,Actor,在Akka中有两种不同的发送机制:告诉演员的东西,和?询问演员的东西,对于那些不熟悉的人来说,主要的区别是演员!消息是一个“开火并忘记”操作,以及参与者?消息返回一个结果承诺,然后在以后需要解决 我在Erlang中找不到任何与此相关的信息,因为谷歌搜索“Erlang ask操作”或简单的“Erlang ask”产生的结果不太有用。不,没有,但您的请求很容易实现: ask(Pid, M) -> Promise = erlang:monitor(process, Pid), Pid !
告诉演员的东西,和?
询问演员的东西,对于那些不熟悉的人来说,主要的区别是演员!消息
是一个“开火并忘记”操作,以及参与者?消息
返回一个结果承诺,然后在以后需要解决
我在Erlang中找不到任何与此相关的信息,因为谷歌搜索“Erlang ask操作”或简单的“Erlang ask”产生的结果不太有用。不,没有,但您的请求很容易实现:
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
上请求一个监视器引用的,它允许我们在它死亡时监视它。我们还将此引用用作promise的唯一标记,以便在邮箱中的其他类似邮件中找到它。Erlang不支持promises或futures。有关模拟它们的其他示例,请参见。另请参阅以了解为何Erlang使用消息传递而不是承诺和未来的解释。Akka中的?
是使用构建的代码>。它所做的是:它创建了一个新的临时参与者,作为使用普通发送的消息的发送者代码>。如果它没有及时收到任何东西,它就会使承诺失败。如果它做到了,那就是承诺
然后,被询问的参与者将回复该临时参与者(这是您如何知道实际回复了哪条消息的方式,否则您必须自己在地图或类似的东西中跟踪该消息)
这就是为什么必须显式导入ask
模式,以及为什么它被称为模式,而不是像那样的内置原语代码>是
您可以在Erlang中实现相同的模式。Akka使用消息传递和承诺,它们不是相互排斥的概念,我没有说它们是:-)支持承诺将以牺牲容错为代价,因此Erlang明确选择消息传递作为唯一的并发模型。请参阅Joe Armstrong的博士论文,其中他解释了他实现Erlang的方式背后的原因(第22页2.4.3):