시작이 반

[Kotlin] CoroutineScope란? 본문

Programming/Kotlin

[Kotlin] CoroutineScope란?

G_Gi 2023. 4. 27. 20:20
SMALL

CoroutineScope

CoroutineSocpe는 Coroutine이 실행될 수 있는 범위를 나타낸다.

이 범위는 Coroutine의 라이프사이클과 관련이 있으며 Coroutine이 완료되거나 종료될때 해당 범위가 생성되거나 없어진다.

 

코루틴 스코프 내에서 실행되는 코루틴은 부모-자식 관계를 가지며 자식의 코루틴이 예외가 발생하면 부모로 전파를 하여 모두 종료가된다. (But, 슈퍼 바이저 잡을 사용하면 예외 전파를 자식에게만 할 수 있다.)

 

코루틴 스코프를 만드는 방법에는 하위와 같은 방법 등이 있다.

 

코루틴 스코프 빌더 코루틴 빌더
runBlocking launch
coroutineScope async
withContext produce
supervisorScope actor
GlobalScope runBlocking (top-level)
  • runBlocking : 메인 함수 또는 테스트 코드에서 사용되며, 코루틴 실행이 완료될 때까지 현재 스레드를 차단합니다.
  • coroutineScope : 코루틴 스코프를 만들어 줍니다. 모든 자식 코루틴이 완료될 때까지 해당 코루틴 스코프에서 블록됩니다.
  • withContext : 코루틴 컨텍스트를 변경합니다. 지정된 컨텍스트에서 코드 블록이 실행됩니다.
  • supervisorScope : coroutineScope과 유사하지만, 자식 코루틴에서 발생하는 예외에 대해 부모 코루틴을 영향받지 않도록 보장합니다.
  • GlobalScope : 전역 코루틴 스코프를 제공합니다. 애플리케이션 수준에서 코루틴을 실행할 때 사용됩니다.
  • launch : 비동기 코루틴을 시작합니다. 코루틴이 백그라운드에서 실행되며, 코루틴이 끝날 때까지 기다리지 않습니다.
  • async : 비동기 작업을 실행하고 결과를 반환합니다. await 함수를 사용하여 결과를 기다릴 수 있습니다.
  • produce : 소비자-생산자 모델을 구현하는 데 사용됩니다. 코루틴으로 데이터를 생성하고 소비하는 코루틴을 만들 수 있습니다.
  • actor : produce와 유사하지만, 소비자 코루틴에서 메시지를 처리하는 동안 상태를 유지할 수 있는 코루틴입니다.

 

 

코루틴 빌더는 코루틴 스코프의 확장 함수로 정의된다. 이로써 소속된 코루틴 스코프의 코루틴 컨텍스트를 자동으로 상속받는다. 최상위에 스코프를 하나 생성하고 계속 코루틴 빌더를 사용해서 스코프를 이어나갈 수 있다.

 

CoroutineSocpe는 하나의 멤버 속성으로 CoroutineContext를 가지고 있다.

 

 

CoroutineContext

CoroutineContext란 Coroutine을 실행하기 위한 환경을 정의하는데 사용된다. (스레드 풀, 예외처리기, 디스패처 등.)

CoroutineContext를 이용하여 코루틴의 실행 환경을 제어할 수 있다. 

명시하지 않으면 빈 Context가 들어감

CoroutineContext는 아래와 같은 여러개의 Element를 가지고 있다. 아래 요소를 조합해서 새로운 Context를 만들 수 있따.

 

  • Job: 코루틴의 작업 단위를 나타냅니다. 코루틴의 실행 상태를 관리하는데 사용됩니다.
  • CoroutineDispatcher: 코루틴이 실행될 스레드를 관리하는 역할을 합니다. 코루틴의 실행 환경에 대한 컨텍스트 정보 중 하나입니다.
  • CoroutineName: 코루틴의 이름을 나타냅니다. 디버깅 용도로 사용됩니다.
  • CoroutineExceptionHandler: 코루틴에서 예외가 발생할 때 처리하는 핸들러입니다.

 

CoroutineDispatcher

CoroutineDispatcher는 아래와 같은 종류가 있다.

  • Dispatchers.Default: CPU 바운드 작업에 적합한 공유 백그라운드 스레드 풀을 사용하는 디스패처입니다.
  • Dispatchers.IO: I/O 바운드 작업에 적합한 공유 백그라운드 스레드 풀을 사용하는 디스패처입니다.
  • Dispatchers.Main: 안드로이드의 UI 스레드에서 코루틴을 실행하기 위한 디스패처입니다.
  • Dispatchers.Unconfined: 현재 스레드에서 즉시 실행되는 디스패처입니다. 이 디스패처를 사용하면 다른 스레드로 코루틴이 이동하지 않습니다.
  • 사용자 정의 디스패처: 사용자가 직접 만들어서 사용할 수도 있습니다. 이 경우에는 CoroutineDispatcher 클래스를 상속받아서 구현하면 됩니다.
LIST