2014-03-25 73 views
3

Erlang有Future and Promises的等價物嗎?或者,因爲未來和承諾正在解決Erlang系統中不存在的問題(例如同步編排),因此我們在Erlang中不需要它們。Erlang的期貨和承諾

如果我想在Erlang中使用期貨和承諾的語義,他們可以通過Erlang流程/演員來模擬嗎?

+0

Erlang的併發模型是不同的。 Erlang的併發系統基本構建塊是輕量級進程(比操作系統進程輕得多)。有關如何「完成掛鉤」,請參閱http://www.erlang.org/doc/getting_started/conc_prog.html。 –

+0

也就是說,https://github.com/gleber/erlfu。 –

+0

我想如果你在Erlang尋找未來,你可能會試圖解決錯誤的問題。 –

回答

7

你可以輕鬆地實現在二郎山未來是這樣的:

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. 

在一間模塊和建築鏈這個功能從它應該是一件容易的事,但說實話,我從來沒有真正錯過了這樣的事情。如果你只是自由發送消息,你會更靈活。

+0

該功能已存在於模塊中。看到我的答案。 –

+0

您需要添加對該消息的引用並在回覆中將其匹配。否則,你可能會混淆一個答覆的另一個。 –

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} 

這一切都在標準庫,隨時可以使用。

+1

這種方法的缺點是不允許使用匿名函數,即不能執行'rpc:async_call(node(),fun() - > timer:sleep(30000)end)'。 – filmor

+0

可以使用'erlang:apply/2'作爲提供給'rpc:async_call/4'的函數。你可以做一些像'rpc:async_call(node(),erlang,apply,[fun() - > ok end,[]])。'。 –