摘要:
本將主要內容: 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操作 同步與非同步 同步 發起乙個任務後,必須原地等待任務執行結束,拿到乙個明確的結果 非同步 發起乙個任務後,不需要等待,繼續往下執行 非同步任務的...