【问题标题】:Simple concurrency with an Akka Hello World sampleAkka Hello World 示例的简单并发
【发布时间】:2013-11-29 18:07:36
【问题描述】:

我正在评估 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")
  }
}

我已经尝试从 Main 类创建多个演员,但不知何故感觉不对,我不应该只调用演员然后它自己处理并发/产生更多演员吗?谁能提供一个例子(最好修改上面的代码)。我一直在阅读和阅读,但感觉需要立即吸收很多东西,我觉得我只是在这里某个地方错过了一个关键概念。

【问题讨论】:

  • 查看路由器以了解您要执行的操作:doc.akka.io/docs/akka/2.2.0/scala/routing.html。而且您不想在您的receive 中添加sleep
  • @sourcedelica 这正是我所追求的,谢谢。如果您想提交作为答案,我会接受吗?

标签: scala akka


【解决方案1】:

对于您的用例,您可能希望使用Routers

例如:

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

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

附带说明,您应该避免在您的演员的receive 方法中阻塞(即Thread.sleep)。

【讨论】:

  • 这是否意味着 10 个 HelloActor 实例?我很难理解路由器,谢谢。 @sourcedelica
  • 是的。查看Routing 上的文档。
【解决方案2】:

正如@sourcedelica 在 cmets 中提到的,路由可能是您想要做的。使用RoundRobinRouter 对您的示例进行简单的重构可能如下所示:

import akka.actor._
import akka.routing._

object HelloActor {
  case class SayHello
}

class HelloActor extends Actor {
  def receive = {
    case HelloActor.SayHello =>      
      println(s"saying hello from: ${self.path}")
  }
}

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

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

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

这是一个非常简单的示例,因为它使用了一个简单的路由器(循环)并且它不调整大小。您可以使用路由器做更多事情,我强烈建议您在以下位置阅读更多内容:

http://doc.akka.io/docs/akka/2.2.3/scala/routing.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 2017-08-04
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多