programming erlang ch10 - andstudy/forge GitHub Wiki
- ๋ถ์ฐ ์ผ๋ญ : LANํ๊ฒฝ
- ์์ผ-๊ธฐ๋ฐ ๋ถ์ฐ : WANํ๊ฒฝ
- ๋น๋ถ์ฐ ์ผ๋ญ ์ธ์ ์์ ์์
- ๋์ผํ PC์์ ํ ์คํธ
- ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋ ๋ PC์์ ํ ์คํธ
-
์์ ์ ์ฐจ
-
๋จ๊ณ1: ๋น๋ถ์ฐ ์ผ๋ญ ์์คํ ์์ ์ด๋ฆ ์๋ฒ ์์ฑ, ํ ์คํธ
-module(kvs). -export([start/0, store/2, lookup/1]). % compile(export_all)์ ์๋ํ์ง ์์ -> rpc๋ผ์ด๋ธ๋ฌ๋ฆฌ๋๋ฌธ.. start() -> register(kvs, spawn(fun() -> loop() end)). store(Key, Value) -> rpc({store, Key, Value}). lookup(Key) -> rpc({lookup, Key}). rpc(Q) -> kvs ! {self(), Q}, receive {kvs, Reply} -> Reply end. loop() -> receive {From, {store, Key, Value}} -> put(Key, {ok, Value}), %ํ๋ก์ธ์ค์ฌ์ ์ put์ด์ฉ From ! {kvs, true}, loop(); {From, {lookup, Key}} -> From ! {kvs, get(Key)}, %ํ๋ก์ธ์ค์ฌ์ ์ get์ด์ฉ loop() end.
-
-
๋จ๊ณ2: ๋์ผ๋จธ์ ์ ๋ ๋ ธ๋์์ ํ ์คํธ
-
gandalf๋ ธ๋ ์์ฑ
$ erl -sname gandalf (gandalf@localhost) 1> kvs:start(). true -
bilbo๋ ธ๋ ์์ฑ ๋ฐ ๊ธฐ๋ฅ ํ ์คํธ
$ erl -sname bilbo (bilbo@localhost) 1> kvs:start(). true (bilbo@localhost) 2> rpc:call('gandalf@localhost', kvs, store, [weather, fine]). true (bilbo@localhost) 3> rpc:call('gandalf@localhost', kvs, lookup, [weather]). {ok,fine}
-
-
๋จ๊ณ3: ๋์ผ ๋ก์ปฌ ์์ญ ๋คํธ์ํฌ ์์ ์๋ก ๋ค๋ฅธ PC์์ ํ ์คํธ
-
์ฝ๋
%์ฒซ๋ฒ์งธ pc PC1> erl -sname foo -setcookie abc %๋๋ฒ์งธ pc PC2> erl -sname bar -setcookie abc -
์ค๋ช
- sname : short name -> DNS์๋น์ค ์ฌ์ฉํ ์ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ
- ๋ ๋ ธ๋๋ ๊ฐ์ ์ฟ ํค๋ฅผ ๊ฐ์์ผ ํ๋ค.
- ์คํํ๋ ค๋ ์ฝ๋ ๋ฒ์ ์ด ๊ฐ์์ผ ํ๋ค.
-
-
๋จ๊ณ4: ๋ค๋ฅธ ๋๋ฉ์ธ์ ์ํด์๋ ๋๋์ ๋จธ์ ์์ ์ด๋ฆ ์๋ฒ ํ ์คํธ
-
epmd๋ฅผ ์ฌ์ฉํ์ฌ 4369ํฌํธ๊ฐ ์ด๋ ค์๋์ง ํ์ธ.
-
๋ถ์ฐ ์ผ๋ญ์ด ์ฌ์ฉํ ํฌํธ ๋ฒ์๋ฅผ ์ ํ๊ณ ํฌํธ๊ฐ ์ด๋ ค์๋์ง ํ์ธ
$ erl -name ... -setcookie ,,, -kernel inet_dist_listen_min Min inet_dist_listen_max Max
-
-
๋ถ์ฐ ํ๋ก๊ทธ๋จ์ BIF
@spec spawn(Node, Fun) -> Pid @spec spawn(Node, Mod, Func, ArgList) -> Pid % apply์ ์ํด ์ํ๋๋ ํ๋ก์ธ์ค ์์ฑ @spec spawn_link(Node, Fun) -> Pid @spec spawn_link(Node, Mod, Func, ArgList) -> Pid % ์ ํ๋ก์ธ์ค๊ฐ ํ์ฌ ํ๋ก์ธ์ค์ ์ฐ๊ฒฐ @spec disconnect_node(Node) -> bool() | ignore % ๊ฐ์ ๋ ธ๋ ๋๊ธฐ @spec moniter_node(Node, Flag) -> true % Flag๊ฐ true๋ฉด ๋ชจ๋ํฐ๋ง ์ผ์ง, false๋ฉด ๋ชจ๋ํฐ๋ง ๊บผ์ง, {nodeup, Node}์ {nodedown, Node}๋ฅผ ๋ฐ์ @spec node() -> Node @spec node(Arg) -> Node @spec nodes() -> [Node] @spec is_alive() -> bool() {RegName, Node} ! Msg %๋ฑ๋ก๋ ๋ ธ๋์ ๋ฉ์์ง ์ ์ก -
์๊ฒฉ ๋์ฐ๊ธฐ
-module(dist_demo). -export([rpc/4, start/1]). start(Node) -> spawn(Node, fun() -> loop() end). rpc(Pid, M, F, A) -> Pid ! {rpc, self(), M, F, A}, receive {Pid, Response} -> Response end. loop() -> receive {rpc, Pid, M, F, A} -> Pid ! {self(), (catch apply(M, F, A))}, loop() end. -
์๊ฒฉ ๋ ธ๋ ์คํ
(foo@localhost) Pid = dist_demo:start( bar@localhost ). <0.49.0>j (bar@localhost)5> dist_demo:rpc( Pid, os, cmd, [notepad]).
-
์๊ฒฉ๋ ธ๋ ์คํ์ ํ์ค๋ฐฐํฌํ
call(Node, Mod, Function, Args) -> Result | {badrpc, Reason}
- ์ฟ ํค ์ค์ ๋ฐฉ๋ฒ
- $HOME/.erlang.cookieํ์ผ์ ๋์ผํ ์ฟ ํค ์ ์ฅ
- ๋ช ๋ นํ ์ธ์ -setcookie๋ก ๋งค์ง ์ฟ ํค ์ค์
- BIF erlang:set_cookie(node(), Cookie)์ฌ์ฉ
-
๋ถ์ฐ์ผ๋ญ ๋ฌธ์ ์ : ๋ณด์์ด ์ทจ์ฝํ๋ค.
-
๋ถ๋ก D -> lib_chan ์ฌ์ฉํ ์์ผ ๊ธฐ๋ฐ ๋ถ์ฐ
-
๊ตฌ์ฑ ์ค์ ํ์ผ
{port, 2223}. {service, chat, password,"AsDT67aQ",mfa,mod_chat_controller,start,[]}. -
์๋ฒ ์ฝ๋
-module(mod_name_server). -export([start_me_up/3]). start_me_up(MM, _ArgsC, _ArgS) -> loop(MM). loop(MM) -> receive {chan, MM, {store, K, V}} -> kvs:store(K, V), loop(MM); {chan, MM, {lookup, K}} -> MM ! {send, kvs:lookup(K)}, loop(MM); {chan_closed, MM} -> true end. -
ํด๋ผ์ด์ธํธ ์ฝ๋
{ok, Pid} = lib_chan:connect( "localhost", 1234, nameServer, "ABXy45", ""). lib_chan:cast(Pid, {store, joe, "write a book"}). lib_chan:rpc(Pid, {lookup, joe}). lib_chan:rpc(Pid, {lookup, jim}).