【发布时间】:2015-03-10 08:56:26
【问题描述】:
我对 Scala 的 Future 和 Akka 非常陌生,目前,我正在尝试实现一个应用程序,该应用程序执行一系列独立任务并将结果收集在一起。
例如,我想要一个由多个任务组成的应用程序,每个任务接收一个数字,休眠几秒钟,然后返回“Hello”消息。
actor实现如下:
class HelloActor extends Actor {
def receive = {
case name:Int => {
println("%s will sleep for %s seconds".format(name, name % 4))
Thread.sleep(name % 4 * 1000)
sender ! "Hello %s".format(name)
}
}
}
主要对象实现为:
object HelloAkka extends App {
val system = ActorSystem("HelloSystem")
val helloActor = system.actorOf(Props[HelloActor], name = "helloactor")
implicit val timeout = Timeout(20, TimeUnit.SECONDS)
val futures = (1 to 10).map(num => {
helloActor ? num
})
val future = Future.sequence(futures)
val results = Await.result(future, timeout.duration)
println(results)
system.shutdown
}
由于每个任务将休眠 0、1、2 或 3 秒,我希望首先执行休眠时间较短的任务。但是,结果是:
1 will sleep for 1 seconds
2 will sleep for 2 seconds
3 will sleep for 3 seconds
4 will sleep for 0 seconds
5 will sleep for 1 seconds
6 will sleep for 2 seconds
7 will sleep for 3 seconds
8 will sleep for 0 seconds
9 will sleep for 1 seconds
10 will sleep for 2 seconds
Vector(Hello 1, Hello 2, Hello 3, Hello 4, Hello 5, Hello 6, Hello 7, Hello 8, Hello 9, Hello 10)
也就是说,所有的任务都是按顺序执行的。我想知道是否有任何方法可以让我并行执行所有任务。
【问题讨论】:
-
您将所有请求发送给同一个参与者。来自/发往同一对参与者的消息保证按顺序执行。您可以将它们发送到 10 个不同的 actor 副本,也可以在 actor 内部的 Sleep 周围移动 Future 运算符。
-
@DiegoMartinoia 非常感谢,当我使用多个演员时它可以工作。您可以发表您的评论作为答案,以便我标记它吗?
-
完成,感谢您的耐心等待!