Erlangでfutureパターン

30分プログラム、その401。ErlangJava言語で学ぶデザインパターン入門 マルチスレッド編に載ってる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.