Akka併發程式設計 5 Actor模型 五)

2021-07-31 17:16:34 字數 4694 閱讀 2605

摘要:

本將主要內容: 1. !訊息傳送,fire-and-forget訊息模型 2. ?訊息傳送,send-and-receive-future訊息模型 

akka提供了兩種訊息模型:fire-and-forget和send-and-receive-future。fire-and-forget是一種單向訊息傳送模型,指的是非同步傳送訊息,通過非同步傳送訊息且訊息傳送後可以立即返回,akka中使用!方法進行fire-and-forget訊息傳送,如stringactor!」creating actors with implicit val context」,它的意思是當前傳送方aactor向stringactor傳送字串訊息」creating actors with implicit val context」,傳送完該訊息後立即返回,而無需等待stringactor的返回,!還有個過載的方法

tell

;send-and-receive-future指的是非同步傳送訊息則是一種雙向訊息傳送模型,向目標actor傳送完訊息後,然後返回乙個future作為後期可能的返回,當前傳送方actor將等待目標actor的返回,akka中使用?方法進行send-and-receive-future訊息的傳送,它也同樣有乙個過載的方法

ask。

/**

* 訊息處理:!(fire-forget)

*/import akka.actor.actor

import akka.actor.props

import akka.event.logging

import akka.actor.actorsystem

//定義幾種不同的訊息

case class start(var msg:string)

case class run(var msg:string)

case class stop(var msg:string)

class exampleactor extends actor

} class otheractor extends actor

} //建立actorsystem,actorsystem為建立和查詢actor的入口

//actorsystem管理的actor共享配置資訊如分發器(dispatchers)、部署(deployments)等

val system = actorsystem("messageprocessingsystem")

//建立contextactor

val exampleactor = system.actorof(props[exampleactor],name="exampleactor")

//使用fire-and-forget訊息模型向exampleactor傳送訊息

exampleactor!run("running")

exampleactor!start("starting")

//關閉actorsystem

system.shutdown()

}

**執行結果如下:

在exampleactor中,通過隱式變數context建立了otheractor例項:val other = context.actorof(props[otheractor], 「otheractor」),在exampleactor的receive方法中,處理兩種不同型別的訊息例如:

//使用fire-and-forget訊息模型向otheractor傳送訊息,隱式地傳遞sender

case start(msg) => other ! msg

//使用fire-and-forget訊息模型向otheractor傳送訊息,直接呼叫tell方法,顯式指定sender

case run(msg) => other.tell(msg, sender)

處理start型別的訊息時,直接使用!進行訊息傳送,而處理run型別的訊息時,使用的是tell方法,可以看到使用tell方法需要顯式地指定其sender,而使用!進行訊息傳送則不需要,事實上!方法通過隱式值傳入需要的sender,對比!與tell方法的定義便很容易理解

//!方法的定義

def !(message: any)(implicit sender: actorref =

actor.nosender

): unit

//tell方法的定義

final def tell(msg: any, sender: actorref): unit = this.!(msg)(sender)

這裡的this指呼叫tell函式(方法)的actor。可以看到,

tell方法的實現依賴於!方法

。如果在乙個actor當中使用!方法時,例如exampleactor中使用的other ! msg向otheractor傳送訊息,則sender隱式為exampleactor,如果不是在actor中使用則預設為actor.nosender,即sender為null。

理解了fire-and-forget訊息模型後,接著對send-and-receive-future訊息模型進行介紹,下面的**給出了其使用示例。

/**

* 訊息處理:?(send-and-receive-future)

*/import akka.actor.actor

import akka.actor.props

import akka.event.logging

import akka.actor.actorsystem

import scala.concurrent.future

import akka.pattern.ask

import akka.util.timeout

import scala.concurrent.duration._

import akka.pattern.pipe

import scala.concurrent.executioncontext.implicits.global

//訊息:個人基礎資訊

case class basicinfo(id:int,val name:string, age:int)

//訊息:個人興趣資訊

case class interestinfo(id:int,val interest:string)

//訊息: 完整個人資訊

case class person(basicinfo: basicinfo,interestinfo: interestinfo)

//基礎資訊對應actor

class basicinfoactor extends actor

} //興趣愛好對應actor

class interestinfoactor extends actor

} //person完整資訊對應actor

class personactor extends actor

} class combineactor extends actor yield person(basicinfo, interestinfo)

//將future結果傳送給personactor

pipe(combineresult).to(personactor)

}} val _system = actorsystem("send-and-receive-future")

val combineactor = _system.actorof(props[combineactor],name="combineactor")

combineactor ! 12345

thread.sleep(5000)

_system.shutdown

}

**執行結果如下:

**中定義了3種型別的訊息,分別是

個人基礎資訊

case class basicinfo(id:int,val name:string, age:int)、

個人興趣資訊

case class interestinfo(id:int,val interest:string)以及

完整個人資訊

case class person(basicinfo: basicinfo,interestinfo: interestinfo),然後為這3種型別的訊息定義了相應的actor即basicinfoactor、interestinfoactor和personactor。

在combineactor分別建立相應actor的例項,receive方法中使用ask向basicinfoactor、interestinfoactor傳送send-and-receive-future模型訊息,basicinfoactor、interestinfoactor中的receive方法接收到傳送來的int型別訊息並分別使用!向combineactor傳送basicinfo、interestinfo訊息,將結果儲存在future[person]中,然後通過**pipe(combineresult).to(personactor)將結果傳送給personactor。

Akka併發程式設計 4 Actor模型 四)

摘要 本節主要內容 1.停止actor 1 通過actorsystem.shutdown方法停止該system下所有actor的執行 2 通過context.stop方法停止actor的執行 3 通過akka.actor.poisonpill訊息停止actor的執行 本節主要內容 停止actor 1...

Scala併發程式設計Demo(擴充套件Actor)

package com.zzk1 import scala.actors.actor atl enter導包 ctrl i 實現抽象方法 class actordemo extends actor case stop object test 第一步 建立actor例項 第二步 使用start啟動ac...

併發程式設計5

阻塞與非阻塞 阻塞 程式遇到io操作,導致 無法繼續執行,交出cpu執行權 非阻塞 沒有io操作或者遇到io操作也不阻塞 執行 寫程式時要儘量減少io操作 同步與非同步 同步 發起乙個任務後,必須原地等待任務執行結束,拿到乙個明確的結果 非同步 發起乙個任務後,不需要等待,繼續往下執行 非同步任務的...