0%

Actor model

About Actor Model

在Concurrency programming流行之後,Actor Model又重新熱門起來了。
一個Actor要做的就是以下幾件事情

  • 建立其他 Actor
  • 對其他Actor發送消息
  • 接收並處理消息
    因此,Erlang可以這樣寫
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    loop() ->
    receive
    {From, {store, Key, Value}} ->
    put(Key, {ok, Value}),
    From ! {kvs, true},
    loop();
    {From, {lookup, Key}} ->
    From ! {kvs, get(Key)},
    loop()
    end.
    而沒有支援Tail Recursion的程式語言,如Scala等,用Loop來模擬Tail Recursion。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Ping(count: int, pong: Actor) extends Actor {
    def act() {
    var pingsLeft = count - 1
    pong ! Ping
    while (true) {
    receive {
    case Pong =>
    if (pingsLeft % 1000 == 0)
    Console.println("Ping: pong")
    if (pingsLeft > 0) {
    pong ! Ping
    pingsLeft -= 1
    } else {
    Console.println("Ping: stop")
    pong ! Stop
    exit()
    }
    }
    }
    }
    }
    至於C++,有Theron這套Framework可以建構Actor,至於Event-based或是Thread-based就取決於用途了。

Why use Actor Model

根據網路上找到的資料,把它歸類為這幾個理由

  • No shared infomation,在多個Thread共享一段資料的時候,需要用Atomic operation或是Locks作保護。除了性能可能有所損失的話,不當的Lock sequence也會造成Dead lock。而Actor可以將information保存於單一個Actor當中。這樣就少去了錯誤同步的風險。 當然,消除shared infomation的方案還有Functional programming。
  • Asynchronous,雖然Scala有提供同步版本的API。不過大部分的Actor implementation都是Asynchronous。不必耗費CPU Resource在等待完成的時刻。