이번 글에서는 구조적 동시성(Structured Concurrency)의 특징을 정리해본다.
1. 모든 코루틴은 제한된 수명이 있는 위치에서 시작되어야 한다.
가장 대표적인 예로 Activity가 될 수 있다.
RxJava에서는 특정 시점에서 disposable을 모아 처리해야 하는데
컴파일러는 개발자가 처리하는 코드를 작성하지 않아도 경고하지 않는다.
이렇게 clear 혹은 cancel의 과정이 없다면
OOM(Out Of Memory) 에러 혹은 앱 크래시가 발생할 수 있을 것이다.
반면에 코루틴을 사용할 때 예시로 사용했던 코드를 보면 viewModelScope가 있다.
이 스코프는 ViewModel 수명에 엮여있다.
따라서 ViewModel이 수명에 따라 clear될 때,
viewModelScope에서 실행되었던 코루틴은 같이 취소된다.
2. 같은 스코프에서 실행되는 코루틴은 부모-자식 관계를 형성한다.
정확히 따지면 코루틴 자체가 이런 관계를 형성하는 것이 아닌 Job 객체가 이런 관계를 형성한다.
3. 부모 Job은 자식 Job이 완료될 때까지 완료되지 않는다.
위 그림을 예로 들면, Job3가 완료될 때까지 Job2는 완료되지 않는다.
또 Job1, Job2가 완료될 때까지 Job0는 완료되지 않는다.
4. 부모 Job을 취소하면 모든 자식 Job이 취소된다.
자식 Job을 취소해도 부모나 형제 Job은 취소되지 않는다.
다시 위 그림을 예로 들면, Job1을 취소해도 Job2는 취소되지 않는다.
또 Job3를 취소해도 Job2는 취소되지 않는다.
5. Job 타입에 따라 자식 Coroutine에서 에러가 발생하면
다른 형제 Coroutine에게 에러가 전파될 수 있다.
일반적인 경우, 자식 Job에서 에러가 발생하면 부모 Job에 에러가 전파되어 모든 자식 Job이 취소된다.
(4번에서 설명했듯이)
하지만, 부모 Job이 SupervisorJob인 경우
자식 Job에서 에러가 발생해도 다른 자식 Job이 취소되지 않는다.
'Language > Kotlin' 카테고리의 다른 글
Coroutines 여러 개로 연산 속도 높이기 (1) | 2024.11.22 |
---|---|
Java, Kotlin Interoperability 해결하기 (0) | 2024.11.18 |
CoroutineScope와 CoroutineContext 되짚어보기 (0) | 2024.09.21 |
withContext로 스레드 전환하기 (0) | 2024.09.18 |
Coroutines Dispatcher 알아보기 (2) | 2024.09.13 |