Erlang是否支持"问"操作?

时间:2016-02-18 23:07:07

标签: erlang promise akka actor

在Akka中,您有两种不同的发送机制:!用于告诉演员的内容,?用于询问演员的内容,不熟悉的主要区别是actor ! message fire-and-forget 操作,而actor ? message返回结果的承诺,然后在以后需要解决。

我还没能在Erlang找到任何有关谷歌的信息,因为谷歌搜索" Erlang要求操作"或者只是" Erlang问"产生的结果不是很有用。

3 个答案:

答案 0 :(得分:10)

不,它没有,但您要求的内容很容易实现:

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的唯一标记,以便我们可以在邮箱中看到它的其他消息中找到它。

答案 1 :(得分:1)

Erlang不支持承诺或期货。有关模拟它们的其他示例,请参阅this question。另请参阅this article了解Erlang使用消息传递而不是Promises and Futures的原因。

答案 2 :(得分:0)

Akka中的?是使用!构建的。它的作用是:它创建一个新的临时actor,用作使用普通sender调度的消息的!。如果它没有及时收到任何东西,它会使承诺失败。如果这样做,那就更有希望了。

然后,被问及的演员将回复该临时演员(这就是您知道哪条消息实际被回复的方式,否则您必须在地图或类似内容中自行跟踪)。

这就是为什么你必须明确地导入ask模式以及它被称为模式的原因,而不是像!那样的内置原语。

您可以在Erlang中实现相同的模式。