Erlang
今日は仕事をサボってもなんか問題なさげなので。
ちまたで話題のErlangをこっそりと触ってみる。
この前の千葉先生の話を聞いて以来、並列分散という言葉に弱いのだ。
とりあえず、ここを見てお勉強だ。
http://www.erlang.org/doc/getting_started/part_frame.html
プロセスを2個立ち上げて文字を表示する。
-module(tut14). -export([start/0, say_something/2]). say_something(_, 0) -> done ; say_something(What, Times) -> io:format("~p ~w~n", [What, Times]), say_something(What, Times -1) . start() -> spawn(tut14, say_something, [{hello, name, {hoge, fuga}}, 3]), spawn(tut14, say_something, [{goodbye, my}, 3])
複数ノード間の通信
-module(tut17). -export([start_ping/1, start_pong/0, ping/2, pong/0]). ping(0, Pong_Node) -> {pong, Pong_Node} ! finished, io:format("Ping finished~n", []) ; ping(N, Pong_Node) -> {pong, Pong_Node} ! {ping, self()}, receive pong -> io:format("Ping received pong~n", []) end, ping(N - 1, Pong_Node) . pong() -> receive finished -> io:format("Pong finished~n", []); {ping, Ping_PID} -> io:format("Pong recieved ping~n", []), Ping_PID ! pong, pong() end . start_pong() -> register(pong, spawn(tut17, pong, [])) . start_ping(Pong_Node) -> spawn(tut17, ping, [3, Pong_Node]) .
上のコードは以下のように実行する。
Pong側 $ erl -sname pong > tut17:start_pong(). Ping側 $erl -sname ping $ erl -sname ping > tut17:start_ping(pong@myserver).
Pong_Nodeの部分がサーバ(Erlangだとノードと呼ぶ)を示す部分。