본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[kotlin] CoroutineContext 에 대한 이해

by 돼지왕 왕돼지 2022. 2. 3.
반응형

 

-

Kotlin coroutine 의 핵심은 CoroutieContext interface 이다.

모든 launch, async 같은 coroutine builder 는 첫번째 param 으로 CoroutineContext 를 받는다.

이 coroutine builder 들은 CoroutineScope interface 의 extension function 으로 정의되어 있으며, abstract read-only property 로 coroutineContext 를 가지고 있다.

 

-

fun CoroutineScope.launch(
	context: CoroutineContext = EmptyCoroutineContext, 
	start: CoroutineStart = CoroutineStart.DEFAULT, 
	onCompletion: CompletionHandler? = null, 
	block: suspend CoroutineScope.() -> Unit
): Job

 

-

fun <T> CoroutineScope.async(
	context: CoroutineContext = EmptyCoroutineContext, 
	start: CoroutineStart = CoroutineStart.DEFAULT, 
	onCompletion: CompletionHandler? = null, 
	block: suspend CoroutineScope.() -> T
): Deferred<T>

 

-

CoroutineContext inteface 는 사실 type-safe heterogeneous indexed map 이다.

이는 CoroutineContext.Key -> CoroutineContext.Element 매핑이다.

여기서 CoroutineContext.Element 는 CoroutineContext 를 상속했다.

 

기존 Map 을 사용하지 않고 다시 이 녀석을 define 한 이유는..

type-safe 를 해주기 위해, get 이 다음과 같이 정의되었기 때문이다.

fun <E : Element> get(key: Key<E>): E?

 

-

plus operator 는 CoroutineContext instance 를 합친다.

left side 의 map 에 right side 의 map 을 부어 넣는다고 보면 된다.

 

-

Context 가 필요 없을 때는 EmptyCoroutineContext 를 사용하면 된다.

 

-

CoroutineContext 는 아래 요소들을 담고 있다.

    ContinuationInterceptor

    Job

    CoroutineExceptionHandler

    CoroutineName

class CoroutineContext(
	val continuationInterceptor: ContinuationInterceptor?,
	val job: Job?,
	val coroutineExceptionHandler: CoroutineExceptionHandler,
	val name: CoroutineName?
)

 

-

ContinuationInterceptor 는 continuation 을 위해 invoke 된다.

이것은 실행 thread 를 관리하기 위해 사용된다.

이 녀석은 CoroutineDispatcher 를 상속한다.

 

-

Job 은 coroutine 실행의 life-cycle 과 task hierarchy 를 모델링한다.

 

-

CoroutineExceptionHandler 는 coroutine builder 가 exception 을 전파하지 않기 위해 사용한다.

 

-

CoroutineName 은 debug 용도로 사용한다.

 

-

Coroutine builder 를 사용할 때 다음 3개의 context가 관여한다.

    CoroutineContext 를 제공하기 위한 CoroutineScope receiver. 이는 inherited context 이다.

    builder 는 첫번째 param 으로 CoroutineContext 를 받는다. 이를 context argument 라고 한다.

    suspending block 은 CoroutineScope receiver 를 가진다. 이는 CoroutineContext 를 제공하며 이를 coroutine context 라고 부른다.

 

-

parent context = default values + inherited context + context argument

coroutine context = parent context + coroutine job

 

 

 

참고 : https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad 

 

반응형

댓글