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"))
            }
        }
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.