[英]How to handle multiple Akka Actors?
我的实际用例是MyActor收到一条消息以开始其工作。 该工作需要下载几个网页,因此要求MyActor下载。 每当文章完成下载时,MyActor都会做出响应。
我的代码是否有更好的设计模式? 似乎允许多个参与者更新count变量似乎是不好的,因为我只关心每个参与者特定的计数。
主角:
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
}
}
}
我的演员:
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")
}
}
您也可以创建一个Future
来下载资源。 未来完成后,您可以向主演员发送更新消息,主演员可以对此做出反应。 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
}
}
}
}
我会将scala.concurrent.Promise
发送到资源加载角色,然后可以对其调用.future
以获得scala.concurrent.Future
。
资源加载器在Promise
上调用.complete()
,这又将导致调用Future
上的完整处理程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.