자바스크립트를 허용해주세요.
[ 자바스크립트 활성화 방법 ]
from Mohon Aktifkan Javascript!
 

[Scala] 8장 비동기 프로그래밍과 동시성

728x90

✅ 1. Future

Future는 "미래에 완료될 값"을 나타내는 객체로 비동기적으로 수행하며, 그 결과(success of fail)을 담습니다.

import scala.concurrent.Future
import scala.util.{Success, Failure}
import scala.concurrent.ExecutionContext.Implicits.global

object FutureExample extends App {
    val f: Future[Int] = Future {
    // 시간이 걸리는 작업 (ex. 네트워크 요청)
    Thread.sleep(1000)
    42 
    }

    // 결과 처리
    f.onComplete {
        case Success(value) => println(s"Result: $value")
        case Failure(e) => println(s"Error: ${e.getMessage}")
    }


    Thread.sleep(2000)
}

 ✅ 2. for-comprehension으로 Future 조합 

여러 Future를 순차적으로 처리하거나 서로 계산 결과를 합치고 싶을 때 사용합니다.

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}

object ForComprehensionExample extends App {
   val f1 = Future { 10 }
   val f2 = Future { 20 }

   val result: Future[Int] = for {
    a <- f1 
    b <- f2 
   } yield a + b 

   result.onComplete {
    case Success(sum) => println(s"total: $sum")
    case Failure(e) => println(s"fail: ${e.getMessage}")
   }

   Thread.sleep(1000) // App 종료 방지
}
  • f1 완료 후 a에 값 저장
  • f2 완료 후 b에 값 저장
  • yield a + b -> 두 결과를 합산한 새로운 Future 반환

✅ 3. Await - 동기적으로 결과 가져오기 

Future는 기본적으로 비동기이므로, 메인 스레드가 먼저 끝나면 결과를 확인할 수 없습니다. Await.result 를 쓰면 최대 시간 동안 동기적으로 기다립니다, 실제 서비스에서 사용하지는 않고, 테스트용으로만 사용합니다.

import scala.concurrent.Await 
import scala.concurrent.duration._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global 

object AwaitExample extends App {
    val f = Future { 100 }

    val result = Await.result(f, 2.seconds)
    println(s"Await result: $result")
}
  • 최대 2초 동안 기다려 결과 반환 
  • 시간 초과 시 TimeoutException 발생 가능

✅ 4. ExecutionContext - 스레드 풀 직접 지정

ExecutionContext는 Future가 어떤 스레드에서 실행될지를 결정하며 global을 쓰거나 직접 스레드 풀을 생성할 수 있습니다. 큰 프로젝트에서는 동시 실행 수를 제어할 때 사용됩니다.

import scala.concurrent.{Future, ExecutionContext}
import java.util.concurrent.Executors
import scala.util.{Success,Failure}

object CustomECExample extends App {
    // 글로벌 ExecutionContext를 implicit로 지정
    implicit val ec = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(4))

    val f = Future {
        println(s"Thread: ${Thread.currentThread().getName}")
        42
    }(ec) // Future 실행 시 명시적으로 ec 전달

    f.onComplete {
        case Success(value) => println(s"result: $value")
        case Failure(e) => println(s"Fail: ${e.getMessage}")
    }

    Thread.sleep(1000)
    ec.shutdown()
}
  • onComplete를 포함한 모든 후속 Future 작업에 implicit ExecutionContext 필요
  • 글로벌 ExecutionContext 하나만 선언해주면 해결

✅ 요약

  • Future: 스칼라의 비동기 실행 단위
  • ExecutionContext: Future가 들어갈 스레드폴(실행 환경), 없으면 컴파일 에러
  • 결과 처리:  onComplete로 성공/실패 처리
  • 조합:여러 Future는 for-comprehension으로 묶음
  • Await: 결과를 동기적으로 기다릴 때 사용(권장 X)

 

 

GitHub - Koras02/scala-bloging: https://thinky.tistory.com/category/Back-End/Scala

https://thinky.tistory.com/category/Back-End/Scala - Koras02/scala-bloging

github.com

 

728x90
LIST