본문 바로가기
Android/Kotlin

Kotlin - Coroutine 추가 정리 2

by 2Plus 2020. 5. 29.

지난 글에 이어서 계속 작성해 본다.

지난 글 : 2020/05/27 - [Android/Kotlin] - Kotlin - Coroutine 추가 정리 1

 

구조적 동시성

 앞선 글의 예시들을 보면, Coroutine도 결국 blocking 하고 coroutine이 끝날 때까지 기다리는 식의 전통적인 패턴인 것처럼 보인다. 자바에서는 일반적으로 쓰레드에 대한 참조를 유지하고 모든 쓰레드에 대해 join()을 호출해서 다른 쓰레드를 기다리는 동안 기본 쓰레드를 차단하는 방식으로 진행했다. Coroutine도 이와 비슷하게 처리를 할 수는 있지만 이렇게 예전과 같이 사용하는 방식을 사용하지는 않는다.
 Kotlin에서는 Coroutine을 계층 구조로 만들 수 있다. 그러므로 부모 Coroutine이 자식 Coroutine의 life cycle을 자동으로 관리할 수 있다. 예를 들면, 자식 Coroutine이 완료되기를 기다리거나 자식 중 하나에서 예외가 발생하면 모든 자식 Coroutine을 취소할 수도 있다.

 

 

Coroutine 계층

 Coroutine에서 호출하면 안 되는 runBlocking을 제외한 모든 Coroutine Builder는 개발자들이 Coroutine을 구조화하도록 CoroutineScope 클래스를 확장하여 사용하는 방식을 추천하고 있다.

 

 

 Coroutine을 생성하기 위해서는 GlobalScope(최상위 코루틴)이나 Coroutine Scope(해당 scope의 자식 Coroutine 생성)에서 Builder를 호출해야 한다. Coroutine을 생성하는 함수를 작성하는 경우에는 CoroutineScope 클래스를 확장한 클래스에서 선언해야 한다. 이렇게 사용하면 Coroutine Builder를 쉽게 호출할 수 있다.

 

 

 

 Coroutine Builder의 선언부를 보면, 파라미터로 받는 suspend function이 CoroutineScope 클래스의 확장 함수로 정의되어 있는 것도 확인할 수 있다. 이는 특정 수신자를 지정하지 않고 해당 함수 내에서 다른 Coroutine Builder를 호출할 수 있도록 해 준다. 

 

 

Coroutine Scope Builder

[Example]

 

 

[결과]

 

 

 Coroutine 내부에서 runBlocking 사용은 하지 않는 것이 좋다. Coroutine 내부에서는 쓰레드 차단 기능을 피하고 대신에 suspend 작업을 사용한다. runBlocking과 동일한 일시 중단이 필요할 때는 coroutineScope 빌더를 사용하면 된다. coroutineScope는 모든 자식 Coroutine이 실행을 끝낼 때까지 현재 진행되던 Coroutine을 일시 중단한다. 위의 예시 코드와 결과를 참고하면 확인할 수 있다.

 

 

반응형

댓글