我的實際使用案例是MyActor收到一條消息以開始工作。該工作需要下載幾個網頁,因此它要求MyActor下載。每次文章完成下載時,MyActor都會響應。如何處理多個Akka Actor?
我的代碼有更好的設計模式嗎?似乎允許多個角色更新count變量是不好的,因爲我只關心每個actor的具體數量。
主要演員:
val count = 0
def receive = {
case CountUpdate => count += 1
case Job => {
List(1, 2, 3).map{case num =>
(new myActor ? ToDownload)
val tries = 0
while (tries < 10){
print("Count is: " + count)
tries += 1
// sleep 10 seconds
}
count = 0
}
}
}
MyActor:
def receive = {
case ToDownload => sender ! CountUpdate
}
編輯:
如果我按照利用期貨的建議,不能這可能會導致一個競爭條件?
var downloads: List[Int] = List()
urls.map{ case url => Future{ download(url) }.onComplete{
case Success(value) => downloads = downloads :+ value
case Failure(value) => println("Failure")
}
}
我不相信CountUpdate處理程序將在Job處理程序運行時運行 - Actor從郵箱中一次處理一個消息。因此,MyActor會將CountUpdates推入郵箱,但這些不會反映在count變量中,因爲您仍將處理Job。 –
謝謝@RichHenry,這是真的,我沒有想到! – user2827214
Np,我犯了同樣的錯誤,我用下面的答案解答了Promise。雖然請記住,我不認爲Promise可以發送給一個偏遠的演員 - 我不知道。 –