Scala의 미래 시퀀스
이번 글에서는 Scala의 futures
에 대해 알아보겠습니다.
Scala에서 Future
는 현재 사용할 수 없지만 미래에 사용할 수 있는 값입니다.
Scala에서 동시에/병렬로 작업을 실행하려는 경우 Futures
를 사용합니다. 기본 Java 스레드
를 사용할 수 있지만 Scala Future
가 훨씬 작성하기 쉽기 때문에 선호됩니다.
간단히 말해서 Future
는 알고리즘/응용 프로그램을 동시에 실행하는 간단한 방법을 제공합니다. 퓨처가 생성되면 동시에 실행되기 시작하고 결과를 얻을 수 있는 특정 시점에서 결과를 제공합니다.
Scala에서 순차적으로 Futures
실행
미래
가 순차적으로 실행되기 시작하면 순차적 실행입니다. 스레드 풀을 관리하는 ExecutionContext
를 가져와야 합니다. 그것 없이는 미래
가 실행되지 않습니다.
더 잘 이해하기 위해 예를 살펴보겠습니다.
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object Example extends App {
def task(n: Int) = Future
{
Thread.sleep(1000)
println(n) //to observe the output
n + 1
}
//running in a sequential way
val temp = for {
t1 <- task(1)
t2 <- task(t1)
t3 <- task(t2)
t4 <- task(t3)
t5 <- task(t4)
} yield List(t1,t2,t3,t4,t5)
temp.map(x => println(s"Completed. ${x.size} tasks were executed"))
Thread.sleep(5000) //so that the main thread doesn't quit quickly
}
코드를 실행하면 5개의 작업이 차례로 실행되는 것을 볼 수 있습니다.
Scala에서 퓨처의 동시/병렬 실행
예제 코드:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object Example extends App {
def task(n: Int) = Future
{
Thread.sleep(1000)
println(n) //to observe the output
n + 1
}
val temp = for {
t1 <- task(1)
t2 <- Future.sequence(List(task(t1), task(t1)))
t3 <- task(t2.head)
t4 <- Future.sequence(List(task(t3), task(t3)))
t5 <- task(t4.head)
} yield t2.size + t4.size
temp.foreach(x => println(s"Done. $x task run in concurrent manner"))
Thread.sleep(6000) // needed to prevent the main thread from quitting
// too early
}
위의 코드에서 우리는 Future.sequence
를 사용했는데, 이는 list of futures
를 가져와 future of list
로 변환합니다. 동시에 실행하려는 모든 작업/작업은 목록으로 전달되어야 합니다.
출력:
위의 코드를 실행하면 t2
와 t4
가 병렬로 실행되는 것을 볼 수 있습니다. 병렬 처리로 작업하는 동안 기억해야 할 한 가지는 스레드의 가용성에 따라 실행이 항상 병렬이 아닐 수 있다는 것입니다.
몇 개의 스레드만 있는 경우 다른 작업이 스레드가 해제되기를 기다리는 동안 몇 개의 작업만 병렬로 실행됩니다.
결론
이 튜토리얼에서 우리는 Futures
가 무엇이고 프로그램을 동시에 작성하고 실행하는 데 어떻게 유용한지 이해했습니다.