Erlang中的Future和Promise

3

Erlang是否有Future and Promises的等效物?或者由于future和promises解决的问题在Erlang系统中不存在(例如同步编排),因此我们不需要它们。

如果我想在Erlang中实现futures和promises的语义,它们可以通过Erlang进程/actors模拟吗?


Erlang的并发模型是不同的。Erlang用于并发系统的基本构建块是其轻量级进程(比操作系统进程要轻得多)。请参见http://www.erlang.org/doc/getting_started/conc_prog.html,了解如何“挂钩完成”的示例。 - Benjamin Gruenbaum
话虽如此,https://github.com/gleber/erlfu。 - Benjamin Gruenbaum
1
我认为如果你想在Erlang领域有所发展,可能正在尝试解决错误的问题。 - Zachary K
2个回答

8
您可以像这样轻松地在Erlang中实现一个future:
您可以像这样在Erlang中轻松实现future:
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.

在一个模块中具备这个功能并从中构建链路也应该很容易,但说实话我从来没有想过需要这样的东西。如果你可以自由地发送消息,你会更加灵活。


您需要在回复中添加对消息的引用并进行匹配,否则可能会混淆一个回复与另一个回复。 - Eric des Courtis

5
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}

这些都在标准库中并已经准备好使用。

1
这种方法的缺点是它不允许匿名函数,即你不能执行 rpc:async_call(node(), fun() -> timer:sleep(30000) end) - filmor
可以通过将erlang:apply/2函数作为提供给rpc:async_call/4的函数来实现。您可以执行类似于rpc:async_call(node(), erlang, apply, [fun() -> ok end, []])的操作。 - juan.facorro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接