Erlang有Future and Promises的等價物嗎?或者,因爲未來和承諾正在解決Erlang系統中不存在的問題(例如同步編排),因此我們在Erlang中不需要它們。Erlang的期貨和承諾
如果我想在Erlang中使用期貨和承諾的語義,他們可以通過Erlang流程/演員來模擬嗎?
Erlang有Future and 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_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)'。 – filmor
可以使用'erlang:apply/2'作爲提供給'rpc:async_call/4'的函數。你可以做一些像'rpc:async_call(node(),erlang,apply,[fun() - > ok end,[]])。'。 –
Erlang的併發模型是不同的。 Erlang的併發系統基本構建塊是輕量級進程(比操作系統進程輕得多)。有關如何「完成掛鉤」,請參閱http://www.erlang.org/doc/getting_started/conc_prog.html。 –
也就是說,https://github.com/gleber/erlfu。 –
我想如果你在Erlang尋找未來,你可能會試圖解決錯誤的問題。 –