배우(actor)가 된 루비, Revactor
동시성(concurrency)을 처리하는 기법 중 한 가지는 "액터(actor)"라고하는 기본 단위를 두고 그 액터들 간에 메시지를 주고받는 방법으로 연산을 처리하는 것이다. 예를 들어 A와 B, C 라고하는 세 개의 액터가 있다면 이들은 각자 독립적인 활동을 하면서 서로 간에 소통할 일이 있으면 메시지를 주고 받는다. 액터들 간에는 메시지를 주고받는 것 외에는 어떤 다른 것도 서로 공유하지 않는다. 따라서 흔히 스레드기반으로 동시성을 처리할 때 접하게 되는 경쟁조건(race condition)이나 데드락(deadlock) 같은 문제가 발생할 여지가 없어진다. 서로 "공유하는 상태"라는 것 자체가 없기 때문이다. 그리고 이런 방식의 동시성 처리 모델을 일컬어 '액터 모델(Actor model)'이라 부른다.
이 때 액터들을 각자 하나씩 메일박스(mail)를 가지고 있어서, 액터들 간에 전달되는 메시지는 모두 이 메일박스에 들어오게 되고, 메일박스 속에서는 패턴매칭 또는 필터링을 통해 필요한 메시지만을 캐취하여 그때그때 상황에 맞는 액션을 취하게 된다. 마치 우리가 이메일을 처리하거나 RSS 피드를 구독하는 방식과 전혀 다를 게 없는 이 "자연스러우면서도 인간적인" 처리방식이 새삼 주목을 받게 된 기저에는 "얼랭(erlang)"이라고 하는 프로그래밍 언어의 공이 크다고 할 것이다. 얼랭은 액터 모델에 기반하여 동시성을 처리하는 대표적인 언어 중 하나이기 때문이다. 사실 얼랭이 제법 유명세를 탈 수 있었던 것도 얼랭이 함수형 언어라서 그런 것 보다는 오히려 이 액터모델과 액터모델로 구현된 OTP라는 안정된 일종의 동시성 처리 프레임워크를 가지고 있는 탓이 크다고 할 것이다. 실제 얼랭에서는 이들 "액터"를 "프로세스"라고 부르는데 이 때 프로세스는 흔히 말하는 운영체제 기반의 프로세스가 아니라, 스레드보다 더 경량인 얼랭만의 고유한 프로세스를 일컫는 말이다.
예를 들어, 얼랭에서는 다음과 같은 방식으로 메시지를 처리한다.(즉, 동시성을 다룬다). 간단한 echo 서버인데, spawn 명령으로 프로세스를 하나 띄우면, 그 프로세스는 계속해서 루프를 돌면서 들어오는 메시지를 받아 입맛에 맞는 메시지만 선별적으로 처리하는 구조인 것이다. 이런 프로세스가 한 개, 두 개 뿐이라면 사실 별 의미가 없겠지만, 수천~수십만 개의 프로세스가 동시에 돌아간다면 상황이 조금 달라질 것이다. 그것도 서버가 감내할 수 있는 부하의 범위에서 말이다.
-module(echo).
-export([start/1]).

start() ->
    spawn(fun() -> loop() end).

loop() ->
     receive
         {From, Any} ->
             io:format("Received:~p~n", [Any]),
             From ! Any,
             loop()
     end.
이게 왜 중요한지는 두말할 여지가 없다. 멀티코어 CPU들의 세상이 되고, 갈수록 네트워크와 클러스터링을 감당할 기회가 많아지고 있기 때문에 그런 복잡한 환경 속에서 제대로 모든 자원을 활용하면서 병행 처리를 해 나갈 수 있는 프로그래밍 기법들이 필요해 지는 것은 당연하기 때문이다. 프로그래밍 아이디어가 광우병이나 AI 같은 병원성 전염성을 가지지는 않지만, 그래도 좋은 생각들은 물흐르듯 흐른다. 이제 루비에서도 이와 같은 액터 모델을 구현하는 라이브러러가 등장했으니 바로 Revactor라고 하는 라이브러리다. 루비 1.9 기반에서 돌아가며, 아직은 초기버전 상태이지만 주목할만한 프로젝트라고 생각한다. 예를 들어, 위의 얼랭 코드를 Revactor를 사용하여 다시 루비로 작성해 보면 다음과 같은 형태가 될 것이다.(echo를 돌려 보내는 방법은 아직 찾지 못했다)
require 'revactor'

actor = Actor.spawn do
  Actor.receive do |filter|
     filter.when(:any) do |msg|
       puts "Received:#{msg}"
       # echo back??
     end
   end
end
by thinkr | 2008/05/07 12:43 | 트랙백(1)
Tracked from codian's me2.. at 2008/05/07 15:04

제목 : 꽃띠앙의 생각
배우(actor)가 된 루비, Revactor...more

< 이전페이지 다음페이지 >