2008. 11. 11. 11:42

[erlang] 분산 프로그래밍 맛보기 1.

테스트 환경 window xp

테스트 : 두개의 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 메시지 전달 후 다시 대기

끝..