繁体   English   中英

如何处理多个Akka演员?

[英]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来下载资源。 未来完成后,您可以向主演员发送更新消息,主演员可以对此做出反应。 FutureexecutionContext

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM