Table of contents
Open Table of contents
launch 빌더
lanch
함수는CoroutineScope
를 확장한 함수로, 코루틴을 시작하는 역할을 합니다.CoroutineScope
는 부모 코루틴과 자식 코루틴 사이의 관계를 정립하기 위한 목적으로 사용되는 구조화된 동시성의 핵심입니다.lanch
가 작동하는 방식은 데몬 스레드와 어느 정도 비슷하지만 훨씬 가볍습니다.
runBlocking 빌더
코루틴이 스레드를 블로킹하지 않고 작업을 중단시키기만 하는 것이 일반적인 법칙입니다. 하지만 블로킹이 필요한 경우도 있습니다.
- 프로그램이 끝나는 걸 방지하지 위해 스레드를 블로킹할 필요가 있는 메인함수
- 테스트 코드에서 코루틴을 블로킹하는 경우
메인 함수는 runBlocking
대신에 suspend
를 붙여 중단 함수로 만드는 방법을 주로 사용합니다.
async 빌더
async
는launch
와 비슷하지만 반환값이 있습니다.async
는Deferred
를 반환하며,Deferred
는Job
을 상속받아Job
의 모든 기능을 가지고 있습니다.async
는 두 가지 다른 곳에서 데이터를 얻어와 합치는 경우처럼, 두 작업을 병렬로 실행할 때 주로 사용됩니다.
구조화된 동시성
- 자식은 부모로부터 컨텍스트를 상속받습니다(하지만 자식이 이를 재정의할 수도 있습니다)
- 부모는 모든 자식이 작업을 마칠 때까지 기다립니다
- 부모 코루틴이 취소되면 자식 코루틴도 취소됩니다
- 자식 코루틴에서 에러가 발생하면 부모 코루틴 또한 에러롤 소멸합니다
다른 코루틴 빌더와 달리 runBlocking
은 CoroutineScope
를 확장하지 않습니다.
runBlocking
은 자식이 될 수 없으며 루트 코루틴으로만 사용될 수 있다는 것을 의미합니다.
현업에서의 코루틴 사용
중단 함수는 다른 중단 함수들로부터 호출되어야 하며, 모든 중단 함수는 코루틴 빌더로 시작되어야 합니다.
suspend fun getArticlesForUser(
userToken: String?,
): List<ArticleJson> = coroutineScope {
val articles = async { getArticles(userToken) }
val user = userService.getUser(userToken)
articles.await()
.filter { canSeeOnList(user, it) }
.map { it.toArticleJson() }
}
coroutineScope
는 람다 표현식이 필요로 하는 스코프를 만들어 주는 중단 함수 입니다.- 이 함수는
runBlocking
처럼 람다식이 반환하는 것이면 무엇이든 반환합니다. - 중단 함수 내에서 스코프가 필요할 때 일반적으로 사용하는 함수입니다.