在Akka中,您有两种不同的发送机制:!
用于告诉演员的内容,?
用于询问演员的内容,不熟悉的主要区别是actor ! message
是 fire-and-forget 操作,而actor ? message
返回结果的承诺,然后在以后需要解决。
我还没能在Erlang找到任何有关谷歌的信息,因为谷歌搜索" Erlang要求操作"或者只是" Erlang问"产生的结果不是很有用。
答案 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中实现相同的模式。