0701.Scala Actor Model

有時~指定事件相互獨立, 共同時作且同時發生, 有助於我們設計更高效的程序:Scala Actor model 是一個事件基礎(Event-based)相較 Java Thread 更為輕量級的共時同作模型, 且帶來更佳的開發思維.
- WisdomFish.ORG

Scala 傾向於建議採函數式編程風格來開發多執行緒, 用 不可變狀態(immutable state) 撰寫 無鎖(lock-free)的程式碼. Scala 提供 Actor 是 Scala 中多執行緒(Threads)的基礎,核心思想是利用 訊息傳遞(Message Passing) 來進行輕量級 Thread 間的資訊共享和同步。 消除 Thread 間對資料競爭的困競, 並且不需思考如何加鎖與釋放鎖帶來的困境.

不可變物件, 也就不需再思考多執行緒存取物件時的競爭管理!!!




Scala Actor Thread 模型


Scala Actor Thread 模型可以這樣來理解它:
  1. Actor model 依賴於不變性, 將 immutable ojbects 當作 message 在 actor 間 passing.
  2. 所有 Actor 共享一個線程池,總線程個數可以配置,也可以根據 CPU 個數決定;
  3. 當一個 Actor 啟動之 後,Scala 分配一個線程給它使用,
  4. 如果使用 receive 模型,這個線程就一直為該 Actor 所有,
  5. 如果使用 react 模型,Scala 執行完 react 方法後拋出異常,則該線程就可以被其它 Actor 使用。



不變物件(Immutable object)


  1. 不變物件因沒有狀態可被改變, 故無需顧慮資料競爭問題, 從根本上解決了 Java Thread 帶來的先天問題
  2. 若想改變, 只要另創建一個 immutable object 即可
  3. 先天即為線程安全(thread safe), 可自由地在 thread 間傳遞, 不必對其進行同步(synchronize)
  4. 無複雜的狀態轉換, 簡潔易用, 問題相對少, 也較易驗驗證正確性
  5. 易於在應用間共享與重用, 降低應用資源負擔 - Flyweight pattern

Scala守則:促進不變性

盡可能將可變性降至最低!!!




相較於 Erlang


相較於 Erlang 有二項優勢,
  1. Scala 是強型別編程
  2. Scala 運行於 JVM 可輕易的結合龐大的 Java API 與資源
  3. Actors 非常輕量,大約 600 per/byte,推算 4GB RAM 可以容納 6.5 百萬個 Actors.



Package scala.actor._


  1. scala.actor._
  2. scala.actor.remote._
  3. scala.actor.scheduler._


obejct extends Actor / def act( )


trait Actor

`abstract' modifier can be used only for classes;
it should be omitted for abstract members
  • def act( ): Unit
    • The behavior of an actor is specified by implementing this abstract method.
  • def start( ): Actor



http://developer.51cto.com/art/200908/141150.htm




react()/複用Thread獲取高性能


  1. Scala Actor 建構在 Java Thread 之上, 實際上 actor/per 都必要有 self 的 thread, 這樣 act( ) 才有機會運作.
  2. Java Thread 的開銷並不低, 耗 RAM, JVM 可能有數以百萬計的物件, 但卻可能僅能納數千 Thread.
  3. 切換 Thread 要有數百到數千不等的處理器指令.




Examples




References


  1. Scala.ORG, Scala Actors: A Short Tutorial, http://www.scala-lang.org/node/242
  2. 51cto.comScala Actor:多線程的基礎學習, http://developer.51cto.com/art/200908/141150.htm
  3. 新的Scala Actor類型系統—誰說競爭安全與性能不可兼得 作者 Sadek Drobi 譯者 韓鍇 發佈於 2009年8月2日
    1. A Type System for Scala Actors to Enforce Race Safety Without Sacrificing Performance
    2. Paper, http://lamp.epfl.ch/~phaller/uniquerefs/
  4. The busy Java developer's guide to Scala: Dive deeper into Scala concurrency, http://www.ibm.com/developerworks/java/library/j-scala04109.html
    1. 中文:面向 Java 開發人員的 Scala 指南: 深入瞭解 Scala 並發性, http://www.ibm.com/developerworks/cn/java/j-scala04109.html
  5. http://developer.51cto.com/art/201001/178665.htm



從Java走進Scala:一步步教你使用Scala Actor(1), http://developer.51cto.com/art/200908/144044.htm
从Kestrel看Scala的核心程序模块
Comments