今天學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) } } }
中間用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 模型應用。