Concurrency 二郎的未来与承诺

Concurrency 二郎的未来与承诺,concurrency,erlang,promise,future,Concurrency,Erlang,Promise,Future,Erlang是否有对应的?或者因为future和promises正在解决Erlang系统中不存在的问题(例如同步编排),因此我们在Erlang中不需要它们 如果我想要Erlang中的未来和承诺的语义,可以通过Erlang进程/参与者来模拟它们 您可以很容易地在Erlang中实现这样的未来: F = fun() -> fancy_function() end, % fancy code Pid = self(), Other = spawn(fun() -> X = F(), Pi

Erlang是否有对应的?或者因为future和promises正在解决Erlang系统中不存在的问题(例如同步编排),因此我们在Erlang中不需要它们


如果我想要Erlang中的未来和承诺的语义,可以通过Erlang进程/参与者来模拟它们

您可以很容易地在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.

在模块中拥有此功能并从中构建链也应该很容易,但老实说,我从来没有错过过这样的东西。如果您只是随意发送消息,您会更加灵活。

RPC模块包含满足您需要的
RPC:async\u 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

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

Erlang的并发模型不同。Erlang并发系统的基本构建块是其轻量级进程(比操作系统进程轻得多)。例如,请参阅如何“在完成时挂钩”。也就是说,。我认为如果您在Erlang中寻找未来,您可能试图解决错误的问题。这种方法的缺点是不允许匿名函数,即您不能执行
rpc:async_调用(node(),fun()->timer:sleep(30000)end)
。可以使用
erlang:apply/2
作为提供给
rpc:async\u call/4
的函数。您可以执行类似于
rpc:async_调用(node(),erlang,apply,[fun()->ok end,[])。
。您需要添加对消息的引用,并在回复中匹配它。否则,您可能会将一个答复与另一个答复混淆。
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}