2008. 11. 11. 11:42
[erlang] 분산 프로그래밍 맛보기 1.
2008. 11. 11. 11:42 in programming
테스트 환경 window xp
테스트 : 두개의 system에서 3번의 ping-pong 테스트를 해 본다.(PC두개가 없어서 같은 PC에서 두개의 프로세스를 띄워서 테스트 했다)
테스트 : 두개의 system에서 3번의 ping-pong 테스트를 해 본다.(PC두개가 없어서 같은 PC에서 두개의 프로세스를 띄워서 테스트 했다)
- 설정
- ping system
- erlang 인터프리터 실행시 다음과 같은 옵션으로 실행
- werl -sname ping
- 프럼프트에 "ping@systemname>" 이 떠야 정상
- pong system
- erlang 인터프리터 실행시 다음과 같은 옵션으로 실행
- werl -sname pong
- 프럼프트에 "pong@systemname>" 이 떠야 정상
- 코드
-module(ping_pong).
-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 received 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
- ping
** 간단 설명
- start_ping(Pong_Node) ->spawn(tut17, ping, [3, Pong_Node]). ping()
- function을 Thread에 spawn시킨다.
- Pong_Node는 타겟시스템 이름
- ping(0, Pong_Node) ->
{pong, Pong_Node} ! finished,
io:format("ping finished ~n", []); - pong시스템에게 finished를 전달하고 메시지 출력 후 종료
- erlang에서 ! 연산자는 send message를 의미한다.
- 첫번째 인자가 왜 0인지는 설명이 필요 없을듯..
- ping(N, Pong_Node) ->
{pong, Pong_Node} ! {ping, self()},
receive
pong ->
io:format("Ping received Pong~n", [])
end,
ping(N-1, Pong_Node). - pong 시스템에게 메시지 전달 후 응답 기다림
- 응답이 오면 메시지 출력 후 다시 ping실행 N = 0 일때 까지
- receive 명령어는 다른 프로세스로 부터 메시지가 올때까지 대기 하는 명령어다(WaitForXXX 개념)
- pong() ->
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pong()
end. - ping시스템으로 부터 메지지 대기
- finished 메시지가 오면 메시지 출력 후 종료
- ping메시지가 오면 pong 메시지 전달 후 다시 대기
끝..