Erlang是否具有Future and Promises的等价物?或者因为未来和承诺正在解决Erlang系统中不存在的问题(例如同步编排),因此我们在Erlang中不需要它们。
如果我想在Erlang中使用期货和承诺的语义,可以通过Erlang进程/演员来模仿它们吗?
答案 0 :(得分:8)
你可以像这样轻松地在Erlang中实现未来:
F = fun() -> fancy_function() end,
% fancy code
Pid = self(),
Other = spawn(fun() -> X = F(), Pid ! {future, self(), X} end).
% more fancy code
Value = receive {future, Other, Val} -> Val end.
在模块中使用此功能并从中构建链也应该很容易,但说实话,我从来没有真正错过这样的东西。如果你只是随意发送信息,你会更灵活。
答案 1 :(得分:6)
RPC模块包含rpc:async_call/4
功能,可以满足您的需要。它将在集群中的任何位置运行计算(包括node()
,本地节点),并允许使用rpc:yield/1
等待结果:
1> MaxTime = rpc:async_call(node(), timer, sleep, [30000]).
<0.48.0>
2> lists:sort([a,c,b]).
[a,b,c]
3> rpc:yield(MaxTime).
... [long wait] ...
ok
您还可以使用rpc:nb_yield/1
以非阻止方式进行轮询,或使用rpc:nb_yield/2
进行有限的毫秒轮询:
4> Key2 = rpc:async_call(node(), timer, sleep, [30000]).
<0.52.0>
5> rpc:nb_yield(Key2).
timeout
6> rpc:nb_yield(Key2).
timeout
7> rpc:nb_yield(Key2).
timeout
8> rpc:nb_yield(Key2, 1000).
timeout
9> rpc:nb_yield(Key2, 100000).
... [long wait] ...
{value,ok}
这些都在标准库中,随时可以使用。