二郎的期货和承诺

时间:2014-03-25 13:20:32

标签: concurrency erlang promise future

Erlang是否具有Future and Promises的等价物?或者因为未来和承诺正在解决Erlang系统中不存在的问题(例如同步编排),因此我们在Erlang中不需要它们。

如果我想在Erlang中使用期货和承诺的语义,可以通过Erlang进程/演员来模仿它们吗?

2 个答案:

答案 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}

这些都在标准库中,随时可以使用。