我的实际用例是 MyActor 收到一条消息以开始其工作。该作业需要下载多个网页,因此要求MyActor下载。每次文章下载完成时,MyActor 都会做出响应。
对于我的代码有更好的设计模式吗?允许多个参与者更新计数变量似乎是不好的,因为我只关心每个参与者特定的计数。
主要 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
}
}
}
我的 Actor :
def receive = {
case ToDownload => sender ! CountUpdate
}
编辑:
如果我按照建议使用 future,这不会导致竞争条件吗?
var downloads: List[Int] = List()
urls.map{ case url => Future{ download(url) }.onComplete{
case Success(value) => downloads = downloads :+ value
case Failure(value) => println("Failure")
}
}
最佳答案
您还可以创建一个Future
来下载资源。一旦 future 完成,您可以向主要参与者发送更新消息,主要参与者可以对此使用react。 Future
由 executionContext
执行。
class MainActor extends Actor {
var count = 0
override def receive: Receive = {
case CountUpdate =>
count += 1
println("New count " + count)
case Job =>
val batchIDs = List(1, 2, 3)
implicit val executionContext = ExecutionContext.fromExecutor(new ForkJoinPool())
batchIDs.map {
batchID =>
Future {
// do some work
}.onSuccess{
case _ => self ! CountUpdate
}
}
}
}
关于java - 如何处理多个 Akka Actor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32613322/