我對Scala的Future和Akka非常陌生,目前,我正試圖執行一個應用程序,它執行一系列獨立任務並將結果收集在一起。並行執行期貨清單
例如,我想要一個由多個任務組成的應用程序,每個任務接收一個數字,休眠幾秒鐘,然後返回「Hello」消息。
演員被實現如下:
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個不同副本,也可以在演員的睡眠周圍移動Future操作員。 –
@DiegoMartinoia非常感謝,我使用多個演員時很有用。你可以發表你的評論作爲答案,以便我可以標記它嗎? –
完成,感謝您的耐心等待! –