Erlang是否有Future and Promises的等效物?或者由于future和promises解决的问题在Erlang系统中不存在(例如同步编排),因此我们不需要它们。
如果我想在Erlang中实现futures和promises的语义,它们可以通过Erlang进程/actors模拟吗?
Erlang是否有Future and Promises的等效物?或者由于future和promises解决的问题在Erlang系统中不存在(例如同步编排),因此我们不需要它们。
如果我想在Erlang中实现futures和promises的语义,它们可以通过Erlang进程/actors模拟吗?
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.
在一个模块中具备这个功能并从中构建链路也应该很容易,但说实话我从来没有想过需要这样的东西。如果你可以自由地发送消息,你会更加灵活。
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}
rpc:async_call(node(), fun() -> timer:sleep(30000) end)
。 - filmorerlang:apply/2
函数作为提供给rpc:async_call/4
的函数来实现。您可以执行类似于rpc:async_call(node(), erlang, apply, [fun() -> ok end, []])
的操作。 - juan.facorro