-
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