我正在评估Akka的分布式服务层,以下示例将Hello {n}打印10次,但一次又一次地打印。据我了解,这对于Akka Actor 是有意的,那么我应该从哪里开始使其并发呢?

import akka.actor._

object HelloActor {
  case class SayHello(message: String)
}

class HelloActor extends Actor {
  def receive = {
    case HelloActor.SayHello(message) =>
      Thread.sleep(1000)
      println(message)
  }
}

object Main extends App {
  val system = ActorSystem("ActorSystem")

  val hello = system.actorOf(Props[HelloActor])

  for (i <- 1 to 10) {
    hello ! HelloActor.SayHello(s"Hello $i")
  }
}

我已经尝试过从Main类创建多个actor,但是以某种方式感到不对,我是否不应该只调用actor,然后由它处理并发性/自己产生更多的actor?任何人都可以提供一个示例(最好修改上面的代码)。我一直在阅读和阅读,但是立即接受很多感觉,而且我觉得这里只是缺少一个关键概念。

最佳答案

对于您的用例,您可能需要使用Routers

例如:

val hello = system.actorOf(Props[HelloActor].withRouter(
  RoundRobinRouter(nrOfInstances = 10)))

hello ! HelloActor.SayHello("Hello!")   // Sends to one of the 10

附带说明一下,您应该避免在actor的Thread.sleep方法中进行阻塞(即receive)。

关于scala - 与Akka Hello World示例进行简单并发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20291340/

10-13 07:54