Rulang BridgeでRubyからErlangを呼び出してみた
Rulang BridgeというRuby から Erlang の関数を呼び出すライブラリを見つけたので使ってみました。
これを使うと、Rubyのプログラムからあらかじめ起動しておいたErlangサーバーにアクセスし、Erlangの関数を実行することができます。自作の関数も実行できます(ただし、Erlangサーバー側でロードしておく必要があります)。また、やりとりはTCP/IP上で行われているようなのでそれぞれ別ノードで起動してもOK(のはず)。
使い方
使い方は次の通りです。
- サーバーとするErlangシェルを起動。
- ErlangシェルでRulangサーバーを起動。
- 引数で待ち受けポートを指定する。
- このとき、必要であれば自作の関数をロードしておく。
- クライアントとするRubyスクリプトでRulangBridge::Rulangのインスタンスを生成。
- 引数で、モジュール名、ホスト名、ポートを指定する。
- 1モジュールに付き、1インスタンスが必要。
- 生成したRulangBridge::Rulangインスタンスのメソッドを実行。
Usageがわかりやすいので、悩むことはないかと。
1&2.サーバーとするErlangシェルの実行とRulangサーバーの起動。
Erlangシェルを立ち上げて、そこでRulangサーバーを起動します。
>erl Eshell V5.5.4 (abort with ^G) 1> c(rulang). % rulangをコンパイル {ok,rulang} 2> rulang:start_server(9900). % Rulangサーバーを起動。引数でポートを指定する。 [Start Rulang Server] <0.36.0> 3> c(sample). % クライアントから呼び出すコードを読み込んでおく。 {ok,sample}
読み込んだsample.erlは次の通り。複利計算プログラムです。
-module(sample). -export([compound/3]). % BaseをRateでYear年間運用した際の複利を計算する。 compound( Base, Rate, Year ) -> if Year==0 -> Base; Year/=0 -> compound(Base+Base*Rate, Rate, Year-1) end.
3&4.クライアント側のスクリプトを作成。
RulangBridge::Rulangのインスタンスを生成してメソッドを呼び出せばOK。
require 'rulang' # RulangBridge::Rulangのインスタンスを作成。 # 引数で呼び出す関数のモジュール名と接続先ホスト、ポートを指定する。 rulang = RulangBridge::Rulang.new("sample", "localhost", 9900) puts rulang.compound( 10000, 0.1, 10 ) # sample:compound()を実行して結果を返す。
実行結果です。
25937.4
おー、すげー。
非同期での関数呼び出し
非同期での関数呼び出しもサポートされています。手順は次の通り。
- RulangBridge::Rulang.newの第4引数をtrueにしてインスタンスを生成。
- メソッド呼び出し時に引数にProcを追加する。
- 非同期処理の完了後、Erlang関数の実行結果を引数としてProcが実行される。
- 関数の戻り値はThreadになるので、それを使って処理の待ち合わせなどができる。
require 'rulang' # 非同期呼び出しのサンプル。 # 第4引数をtrueにする。 rulang = RulangBridge::Rulang.new("sample", "localhost", 9900, true) # Erlang関数の引数+Procを指定して関数を実行 # 非同期実行完了後、実行結果を引数としてProcが実行される。 # 関数の戻り値はThreadになる。 thread = rulang.compound( 10000, 0.1, 10, proc { |x| puts x puts "b" }) puts "a" thread.join
実行結果です。
a 25937.4 b