Erlang是否支持;询问;活动

Erlang是否支持;询问;活动,erlang,promise,akka,actor,Erlang,Promise,Akka,Actor,在Akka中有两种不同的发送机制:告诉演员的东西,和?询问演员的东西,对于那些不熟悉的人来说,主要的区别是演员!消息是一个“开火并忘记”操作,以及参与者?消息返回一个结果承诺,然后在以后需要解决 我在Erlang中找不到任何与此相关的信息,因为谷歌搜索“Erlang ask操作”或简单的“Erlang ask”产生的结果不太有用。不,没有,但您的请求很容易实现: ask(Pid, M) -> Promise = erlang:monitor(process, Pid), Pid !

在Akka中有两种不同的发送机制:
告诉演员的东西,和
询问演员的东西,对于那些不熟悉的人来说,主要的区别是
演员!消息
是一个“开火并忘记”操作,以及
参与者?消息
返回一个结果承诺,然后在以后需要解决


我在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):