Erlangでfutureパターン
30分プログラム、その401。ErlangでJava言語で学ぶデザインパターン入門 マルチスレッド編に載ってるfutureパターンをやってみる。
futureパターンはこんな感じで、別スレッドで値を計算させるやつ。
// 別スレッドで処理が走る Data data1 = host.request(10,'A'); // .....別の処理 // 計算した値を表示する。計算が終ってなかったら、待つ Sysetm.out.println(data.getContent());
僕の理解は、Mozartとかの並列言語で有名なデータフロー変数(論理変数)を、Javaで使えるようにするためのパーターンといった感じ。
使い方
% f() -> % io:format("Hello,world!!~n"), % 42. % 別プロセスでfを計算させる 1> X = future:request(fun future:f/0). Hello,world!! % <- 計算が終了した <0.52.0> % 値を取得する 2> future:get(X). 42 % もう一度、取得しても再計算は行なわれない 3> future:get(X). 42
ソースコード
-module(future). -compile([export_all]). loop(Val) -> receive {future,From,get} -> From ! {future,self(),Val}, loop(Val) end. request(F) -> spawn(fun () -> loop(F()) end). get(Pid) -> Pid ! {future,self(),get}, receive {future,Pid,Value} -> Value end. fact(1) -> 1; fact(N) -> N * fact(N-1). f() -> io:format("Hello,world!!~n"), 42.