使用Akka Hello World示例进行简单并发

mat*_*wrk 6 scala akka

我正在评估Akka的分布式服务层,下面的例子打印Hello {n} 10次,但是一个接一个地打印.根据我的理解,这是一个Akka演员的故意,所以我从哪里开始使其并发?

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")
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过从Main类创建多个actor但是在某种程度上感觉不对,我不应该只调用actor然后它自己处理并发/产生更多的actor吗?任何人都可以提供一个这样的例子(最好是修改上面的代码).我一直在阅读和阅读,但立刻感觉很多,我觉得我在某处错过了一个关键概念.

sou*_*ica 4

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

例如:

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

hello ! HelloActor.SayHello("Hello!")   // Sends to one of the 10
Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该避免Thread.sleep在演员的receive方法中阻塞(即)。