Scala的Actor模式 & Akka框架


今天學Spark的時候,看到Scala的actor模式是一個加分點。所以搜了一下,看了。主要參考下面兩篇文章,還沒有實驗,有些地方領會的不深刻:

http://nxlhero.blog.51cto.com/962631/1666250

十分鍾理解Actor模式

Actor模式是一種並發模型,與另一種模型共享內存完全相反,Actor模型share nothing。所有的線程(或進程)通過消息傳遞的方式進行合作,這些線程(或進程)稱為Actor。共享內存更適合單機多核的並發編程,而且共享帶來的問題很多,編程也困難。隨着多核時代和分布式系統的到來,共享模型已經不太適合並發編程,因此幾十年前就已經出現的Actor模型又重新受到了人們的重視。MapReduce就是一種典型的Actor模式,而在語言級對Actor支持的編程語言Erlang又重新火了起來,Scala也提供了Actor,但是並不是在語言層面支持,Java也有第三方的Actor包,Go語言channel機制也是一種類Actor模型。

 

多線程/分布式編程-Actor模型


到了分布式系統時代,工廠已經用流水線了,每個人都有明確分工,這就是Actor模式。每個線程都是一個Actor,這些Actor不共享任何內存,所有的數據都是通過消息傳遞的方式進行的。

 

用scala實現,下面是工程的結構:

這是它們傳遞的消息,有一些指令,剩下的都是Int數據:

 

一個Actor的代碼結構一般是下面這種結構,不停的接受消息並處理,沒有消息就等待:

 

 組裝者代碼:

 

分發者代碼:

 

 加工者代碼:

 

主線程代碼:

 

這個代碼實現的效果與前面用Java實現的是一樣的,但是各個線程沒有共享內存,也沒有鎖,這樣開發起來容易,而且更適合分布式編程,因為分布式編程本身就不適合共享內存。

Scala的Actor不能原生的支持分布式,但是Erlang可以,使用Erlang的Actor,分布式編程就和本地編程基本一樣。但是Erlang的語法難懂,而且沒有變量,幾乎所有需要使用循環的地方都得用遞歸。

 

但是,沒有找到附件。算了。

 

 

還有這篇文章:

http://www.cnblogs.com/shiyangxt/archive/2011/07/30/2121663.html

Scala.Actor實踐心得與設計思想

Scala的Actor

可謂這門語言的一個亮點,函數式編程核心價值在於多核編程,所以就打算說說這個Actor,總結一下學習心得。

 

Actor是一種基於事件的輕量級線程,在以前的並發模型中,我們需要關注共享的數據結構,而使用Actor則需要

關注操作數據的代碼結構,因為減少了數據的共享。Actor的主要能力來源於消息傳遞,而不是采用阻塞調用的處理形式。

如果創建直接或間接擴展 Actor的類,要確保對對象的所有調用都通過消息傳遞進行

 

以消息傳遞為核心的設計:使用Actor的actor方法,使用不可變對象,不考慮數據共享問題,以消息傳遞為設計核心。

 

import actors._, Actor._

object SendMessageStyle {

  def main(args: Array[String]): Unit = {
    val caller = self
    val accumulator = actor {
      var continue = true
      var sum = 0
      loopWhile(continue) {
        reactWithin(500) {
          case number: Int => sum += number
          case TIMEOUT =>
            continue = false
            caller ! sum
        }
      }
    }
    accumulator ! 1
    accumulator ! 2
    accumulator ! 3
    receiveWithin(1000) {
      case result => println("Total is " + result)
    }
  }
}
View Code

 

中間用Java調用Scala函數的代碼,略。

 

測試結果:當使用Receive方法接收消息時,由於Receive會在結束任務前一直持有線程,而Scala在后台默認只給Receive

方法啟動256個線程,我的程序又是順序的發消息,而且不是臨時接收器(只處理一次消息),所以Receive在這種情況下,

只有255個並發。React接收器由於不需要長期持有線程,空閑即釋放線程。所以React在本程序中可以跑20w的並發,如果

簡單優化一下JVM,就可以達到100w的並發量。默認React接收器后台會調用4個線程組成的線程池。如果修改程序讓每個數

組元素給后一位數組元素並發的發消息,那么在不阻塞線程的情況下,Receive方法也可以達到和React一樣的並發量。因為

這個測試程序是順序發送消息,所以就沒有設置超時,如果是並發環境,建議加上超時,避免線程阻塞。

 

100w,真的假的。。

 

前些天看到Scala正在努力支持.net平台,不過我覺得.net平台有F#,所以對於.net程序員來說Scala提供不了什么

附加價值。如果非要找出來這樣做的優點的話,就是Scala可以同時支持兩個主流平台。

 

 

再看一下 Akka框架:

http://blog.csdn.net/jmppok/article/details/17264495

 

Akka 是一個用 Scala 編寫的庫,用於簡化編寫容錯的、高可伸縮性的 Java 和 Scala 的 Actor 模型應用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM