저는 스칼라의 Future와 Akka에 대해 매우 새롭습니다. 현재 독립적 인 작업 목록을 실행하고 함께 결과를 수집하는 애플리케이션을 구현하려고합니다.Future의리스트를 병렬로 실행
예를 들어, 여러 개의 작업으로 구성된 응용 프로그램을 만들고 싶습니다. 각 응용 프로그램은 숫자를 받고 몇 초 동안 잠자기 후 "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)
}
}
}
:
배우가 다음과 같이 구현되는 각 작업은 0, 1, 2, 3 초 동안 잠을 하겠지만
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
}
, 나는 기대 짧은 수면을 먼저 수행해야하는 작업. 그러나 결과는 다음과 같습니다.
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 개의 서로 다른 배우 사본을 보내거나 배우 내부의 수면 주위에서 미래 운영자를 이동할 수 있습니다. –
@DiegoMartinoia 고마워요, 여러 배우를 사용할 때 작동합니다. 당신이 그것을 표시 할 수 있도록 답변으로 의견을 게시 할 수 있습니까? –
완료, 인내심에 감사드립니다! –