scope builder 관련해서 포스팅을 하면서 자료를 찾다보니 정확히 알고있으면 너무나 좋을 만한 포스팅이 있어서 번역해서 올립니다.

https://kotlinlang.org/docs/reference/coroutines/basics.html
해당 글인데 처음부터 차근히 읽으면 coroutine 을 동시성 프로그래밍 관점에서 이해하는데 도움이 될것으로 보입니다.
저는 이중에서 structured concorrency 관련해서 파생해서 알아야하는 내용만 포스팅하겠습니다.

structured concurrency

prologue : 동시성 프로그래밍은 메인 쓰레드를 blocking 을해서 쓰레드를 생성하는 방법과 메인 쓰레드 블로킹없이(non-blocking) 쓰레드풀에서 사용할 쓰레드를 선점하고 뒷단에서 쓰레드풀을 제어하는 방법이 있다. 코루틴은 non-blocking 기반의 동시성 프로그래밍으로 설계되어있다.

기본적으로 launch 블록을 사용할때 GlobalScope.launch 키워드를 사용하게 되는데 이 경우 서비스의 최상위에 코루틴이 만들어 진다. coroutine 모듈이 경량이라고 하더라도 이것은 실행되는동안 메모리 자원들을 소비할수 밖에 없다.
(예를들면 수만번의 반복문을 코루틴을 통해서 한다거나(repeat(100_000){…}) 오랫동안 대기를 시키는경우(delay(10000000L)) 가 될 수 있다.)
만약 우리가 새로이 런치된 코루틴에 대해서 참조(관리)하는것을 잊어버렸다면(forget to keep a reference) 이것은 계속 실행중에 있으럯이다. 이를 위해서 코드에서 구조화 된 동시성(structured concurrency) 를 사용 할 수 있다.

GlobalScope 을 통해서 코루틴을 시작(launch)하는 대신에, 우리가 일반적으로 쓰레드를 사용하듯이(쓰레드는 언제나 전역이다) 코루틴을 실행하고 있는 작업의 특정 범위에서 코루틴을 시작하는 것이다. 예를들면 런블로킹 구문을 코루틴 빌더를 사용해서 메인 함수를 실행하는 것이다. (참고 포스팅 : Kotlin – “coroutine”)

runBlocking 을 포함한 모든 코루틴 빌더는 그 자체의 코드 블럭의 스콥에 coroutineScope 의 인스턴스를 추가한다. 우리는 이 스콥 내에서 명시적으로 새로운 코루틴과 해당 스콥의 코루틴의 연관관계를 선언하지 않고도 (without having to join them explicitly)코루틴을 런치할 수 있는 것이다. 이것은 바깥쪽 코루틴(본체 코루틴) 이 자기 코루틴 스콥에서 시작된 모든 코루틴이 끝날떄 까지 완료하지 않기 때문이다.

Scope builder – 범위 빌더


다른 빌더에서 제공하는 코 루틴 범위 외에도 coroutineScope 빌더를 사용하여 자체 범위를 선언 할 수 있다. coroutineScope 키워드는 코루틴 범위를 만들고 시작된 모든 자식이 완료 될 때까지 완료되지 않기때문에 쓰임이 좋다.

그렇다면 runBlocking 과 coroutineScope 키워드는 어떻게 다를까. 지난번 포스팅에서도 기재했던것 처럼 runBlocking 은 현재 쓰레드를 대기시켜서 막는다(block) coroutineScope 은 다른용도를 위해서 기본 쓰레드를 해제시키고 일시중단(기다리는. – suspend)한다.
그렇기 때문에 runBlocking 은 일반함수로 사용되어서 일반 함수 내에서도 동시성 프로그래밍을 진행할수 있게 하는 반면, coroutineScope 은 suspend 키워드를 가지는 함수여야 한다.

0