Akka Actor入門樣本
來源:互聯網
上載者:User
什麼是Akka。
Akka通常是指一個分布式工具集,用於協調遠程計算資源來進行一些工作,是Actor並行存取模型的一種實現。
Actor的起源。
一篇論文提出了一種並發計算的理論模型。
什麼是Actor。
在Actor模型中,Actor是一個並發原語。
Actor和訊息傳遞
如果多線程同時讀取並修改同一值,那麼可能就需要進行同步並加鎖。
Actor和對象的不同之處在於其不能被直接讀取、修改或是調用。Actor只能通過訊息傳遞的方式與外界進行通訊。
訊息傳遞指的是一個Actor可以接收訊息,本身也可以發送訊息,也可以對接受到的訊息作出回複。
訊息傳遞是非同步。無論是處理訊息還是回複訊息,Actor對外界都沒有依賴。
Actor每次只同步處理一個訊息。郵箱的本質是等待Actor處理的一個工作隊列。
幾個重要的概念
Actor:一個表示工作節點的並發原語,同步處理接收到的訊息。Actor可以儲存並修改內部狀態。
訊息:用於跨進程(比如多個Actor之間)通訊的資料。
訊息傳遞:一種軟體開發範式,通過傳遞訊息來觸發各種行為,而不是直接觸發行為。
郵箱地址:訊息傳遞的目標地址,當Actor空閑時會從該地址擷取訊息進行處理。
Actor系統:多個Actor的集合以及這些Actor的郵箱地址、郵箱和配置等。
Actor的好處:
1.每個Actor各司其職。
2.消除共用狀態。
在多線程編程中,為了保證記憶體中的共用狀態值不出現錯誤,使用鎖和同步機制,防止多個線程讀取並寫入同一個值。
Actor通過減少共用狀態來解決這一問題。
建立第一個Actor
1.首先構造訊息
通過case class來建立不可變訊息,一旦在建構函式中設定屬性初始值,之後就只能夠讀取屬性值,不能再進行修改。
case class SetRequest(key: String, value: Object)
2.定義Actor收到訊息後的響應
既然已經定義好了訊息,現在我們就可以建立Actor,並描述Actor接收到訊息如何做出反應。
import akka.actor.Actor
import akka.event.Logging
import scala.collection.mutable.HashMap
class AkkademyDb extends Actor {
val map = new HashMap[String, Object]
val log = Logging(context.system, this)
override def receive = {
case SetRequest(key, value) => {
log.info("received SetRequest - key: {} value: ", key , value)
map.put(key, value)
}
case o => log.info("received unknown message: {}", o)
}
}
3.與Actor進行互動
import akka.actor.ActorSystem
import akka.testkit.TestActorRef
import akka.util.Timeout
import org.scalatest.{FunSpecLike, Matchers}
import scala.concurrent.duration._
class AkkademyDbSpec extends FunSpecLike with Matchers {
implicits val system = ActorSystem()//擷取Actor系統
implicits val timeout = Timeout(5 seconds)
describe("akkademyDb") {
describe("given SetRequest") {
it("should place key/value into map") {
val actorRef = TestActorRef(new AkkademyDb)//在Actor系統中建立Actor
actorRef ! SetRequest("key", "value")
//。傳遞訊息將訊息放入Actor的郵箱中
//指向背後Actor執行個體的引用
val akkademyDb = actorRef.underlyingActor
//調用get("key")檢查map,確認已經將值存入map中
akkademyDb.map.get("key") should equal (Some("value"))
}
}
}
}