ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Coroutine 순차 처리
    BackEnd/coroutine 2025. 5. 9. 23:50
    반응형

      '토큰 업데이트 후 네트워크 요청', '이미지 변환 후 업로드 요청' 같이 작업 간에 선후 관계(종속성) 있는 작업들이 존재합니다.

     

      다음은 순차처리 되지 않는 코드입니다. 토큰이 업데이트 되고 네트워크 요청을 해야하나, 병렬로 처리되어 토큰 업데이트 완료 전 네트워크 요청이 일어납니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking<Unit> {
        val updateTokenJob = launch(Dispatchers.IO) {
            println("[${Thread.currentThread().name}] 토큰 업데이트 시작")
            delay(100L) // 새로운 토큰을 가져오는데 걸리는 시간
            println("[${Thread.currentThread().name}] 토큰 업데이트 완료")
        }
    
        val networkCallJob = launch(Dispatchers.IO) {
            println("[${Thread.currentThread().name}] 네트워크 요청")
        }
    }

     

    Job 객체

    • 코루틴의 실행과 생명주기를 관리하는 핵심 인터페이스입니다.
    • launch, async 같은 코루틴 빌더 함수는 코루틴을 생성할 때 Job 객체를 반환합니다.
    • Job 객체를 통해 코루틴의 상태를 추적하고 제어할 수 있습니다.

     

    join 함수

      Job 객체의 join 함수를 사용하면, 코루틴 순차 처리가 가능합니다. join 함수를 사용하면 join 함수의 대상이 된 코루틴이 완료될 때까지 join 함수를 호출한 코루틴이 일시 중단됩니다. 아래 코드에서는 runBlocking 코루틴이 updateTokenJob이 완료될 때까지 일시 중단됩니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking<Unit> {
        val updateTokenJob = launch(Dispatchers.IO) {
            println("[${Thread.currentThread().name}] 토큰 업데이트 시작")
            delay(100L)
            println("[${Thread.currentThread().name}] 토큰 업데이트 완료")
        }
        updateTokenJob.join() // networkCallJob 실행 전 updateTokenJob.join() 호출
    
        val networkCallJob = launch(Dispatchers.IO) {
            println("[${Thread.currentThread().name}] 네트워크 요청")
        }
    }

     

    joinAll 함수

      joinAll 함수를 사용하면 복수의 코루틴 순차 처리가 가능합니다. 실무에서는 서로 독립적인 복수의 코루틴을 병렬 실행한 후 이들이 모두 완료되었을 때 다음 작업을 실행해야 하는 경우가 많습니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking<Unit> {
        val convertImageJob1: Job = launch(Dispatchers.Default) {
            Thread.sleep(1000L) // 이미지1 변환 작업 실행
            println("[${Thread.currentThread().name}] 이미지1 변환 완료")
        }
        val convertImageJob2: Job = launch(Dispatchers.Default) {
            Thread.sleep(1000L) // 이미지2 변환 작업 실행
            println("[${Thread.currentThread().name}] 이미지2 변환 완료")
        }
    
        joinAll(convertImageJob1, convertImageJob2) // 이미지 1,2가 모두 변환될 때까지 대기
    
        listOf(convertImageJob1, convertImageJob2).joinAll()
    
        val uploadImageJob: Job = launch(Dispatchers.IO) {
            println("[${Thread.currentThread().name}] 이미지1,2 업로드")
        }
    }
    반응형

    'BackEnd > coroutine' 카테고리의 다른 글

    CoroutineDispatcher  (0) 2025.05.06
    runBlocking  (0) 2025.05.05
    Coroutine 등장 배경  (0) 2025.05.03

    댓글

Designed by Tistory.