2007/05/08

Erlang ファイルサーバプロセスの置き換え


やはり Erlang はすごいです。
古い方の Erlang 本『Concurrent Programing in ERLANG』の 11.9 Relay Techniques に載っていたものですが、心底驚きました。
Erlang ではファイルIOは file_server_2 という名前で登録されたプロセス経由で行います。
その file_server_2 をリモートノードのプロセスで置き換えることにより全てのファイルIOがリモートノードが走っているマシンのファイルシステム対しての操作になります。


-module(pseudo_file_server).
-export([start/0, relay/1]).

start() ->
%% ローカルノードのファイルサーバを登録解除
unregister(file_server_2),
%% リモートノードへのリレーループプロセスを開始
Pid = spawn(?MODULE, relay, ['ubu@172.22.10.22']),
%% そのプロセスをローカルノードのファイルサーバとして登録
register(file_server_2, Pid).

relay(Node) ->
%% リモートノードのファイルサーバの pid を取得
Pid = rpc:call(Node, erlang, whereis, [file_server_2]),
%% リレーループ開始
loop(Pid).

loop(Pid) ->
%% ファイルサーバとして受信したものをリモートノードへリレー
receive
Any ->
Pid ! Any
end,
loop(Pid).

次は実行例です。

2> pseudo_file_server:start().
ture
3> file:write_file("/tmp/a.txt", "hello").
ok

/tmp/a.txt はローカルのファイルシステムではなく、リモートマシンファイルシステム上さ作成されます。
なんと素晴しい。
本の中ではファイルシステムを持たない組み込みシステム等でも、このテクニックによりファイルシステムを使える、とういような説明でした。
『Concurrent Programing in ERLANG』は第一版が1993年、第二版が1996年に出版されています。これまでの間、私たちはいったい何をしていたのでしょうか。
単にマルチコアの普及により Erlang のアーキテクチャが生きるようになっただけなのでしょうが。
素敵ですね。

0 件のコメント: