Erlang是否支持"ask"操作?

Ele*_*fee 4 erlang promise actor akka

在阿卡你有两个不同的发送机制:!,告诉演员的东西,并?询问有关的东西的演员,对于那些不熟悉的主要区别在于,actor ! message是一种发射后不管的操作,并actor ? message返回结果的承诺,然后在以后需要解决.

我对此一直没能找到任何二郎作为谷歌搜索"二郎要求操作",或简称"二郎问"收益率低于有用的结果.

I G*_*ERS 10

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

ask(Pid, M) ->
  Promise = erlang:monitor(process, Pid),
  Pid ! {ask, Promise, M},
  Promise.
Run Code Online (Sandbox Code Playgroud)

等待承诺的结果现在可以通过以下方式完成:

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.
Run Code Online (Sandbox Code Playgroud)

如果你不想在询问和强制之间做任何事情,那么你可以使用OTP行为gen_server,它实际上一次gen_server:call/3实现了这两个功能.

注意在上面我们如何请求目标上的监视器引用,Pid它允许我们监视它是否死亡.我们还使用此引用作为promise的唯一标记,以便我们可以在邮箱中看起来像它的其他消息中找到它.