Coroutine 1 : 기본

김수호·2024년 12월 18일

코틀린

목록 보기
4/5

코루틴의 주요 특징

경량성 1개의 스레드에는 여러개의 코루틴이 실행될 수 있고, 스레드보다 메모리 소모가 적기 때문에, 수천 개의 코루틴을 실행할 수 있습니다.

비동기 작업을 순차적으로 작성할 수 있습니다.
콜백 지옥을 제거하고 코드 가독성을 향상 시킵니다.

코루틴은 특정 지점에서 실행을 중단했다가 재개할 수 있습니다.
이를 통해 I/O 작업이나 네트워크 호출과 같은 비동기 작업이 가능합니다.

코루틴은 특정 스레드에 종속되지 않고 스레드 풀에서 자동으로 스레드를 전환합니다.

스레드와 차이점

Thread

OS의 링크되어 동작하므로 많은 시스템의 자원을 사용
Thread간 전환 시에도 CPU의 상태 체크가 필요하므로 그만큼의 비용이 발생

Coroutine

코루틴은 즉시 실행되는게 아니고 OS의 영향을 받지 않기에 비용이 절약된다.
Coroutine 전환 시 Context Switch가 발생하지 않음
개발자가 직접 루틴을 언제 실행할지, 언제 종료할지 모두 지정이 가능하다.
이렇게 생성한 루틴은 작업 전환 시에 시스템의 영향을 받지 않아, 그에 따른 비용이 발생하지 않음

[참고자료] https://stackoverflow.com/questions/43021816/difference-between-a-thread-and-a-coroutine-in-kotlin

코루틴의 주요 특징

[참고자료] https://kotlinlang.org/docs/coroutines-basics.html#your-first-coroutine

  1. CoroutineScope (코루틴 범위)
    코루틴이 실행될 수 있는 범위를 정의합니다.
    예시: GlobalScope, runBlocking, 사용자 정의 범위 등
  2. CoroutineContext (코루틴 실행 환경)
    코루틴의 스레드, 작업 상태, 예외 처리 등을 포함하는 컨텍스트입니다.
  3. Dispatcher (디스패처)
    코루틴이 어떤 스레드에서 실행될지를 결정합니다.
    주요 디스패처:
    Dispatchers.Main: 메인 스레드(Android UI 작업)
    Dispatchers.IO: I/O 작업을 위한 백그라운드 스레드
    Dispatchers.Default: CPU 집약적인 작업
  4. Job (작업 관리)
    코루틴의 작업 상태(시작, 취소, 완료 등)를 관리합니다.
  5. Suspending Function (중단 함수)
    suspend 키워드가 붙은 함수는 중단할 수 있어 비동기 작업에 사용됩니다.
    호출 시 현재 스레드를 블로킹하지 않고 기다릴 수 있습니다.
fun main() = runBlocking { // this: CoroutineScope
    launch { // launch a new coroutine and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello") // main coroutine continues while a previous one is delayed
}

코드 설명 :

launch는 Coroutine Builder이다. launch는 독립적으로 동작하는 새로운 Coroutine을 나머지 코드와 동시에 실행되도록 한다. 이로 인해 Hello가 처음에 출력된다.

delay는 특별한 일시중단 함수이다. delay는 Coroutine을 특정한 시간 동안 일시중단한다. Coroutine을 일시중단 하는 것은 Coroutine이 실행 중인 스레드를 블록 하지 않으며, 다른 Coroutine 이 해당 스레드에서 자신들의 코드를 실행할 수 있도록 한다.

runBlocking 또한 Coroutine Builder이다. runBlocking은 Coroutine 세계에 속하지 않은 일반적인 fun main() 과 runBlocking { ... } 중괄호 내부의 Coroutine 코드를 연결시켜 주는 역할을 한다. 이는 IDE 내에서 runBlocking 시작 중괄호 '{' 바로 다음에 오는 this: CoroutineScope 힌트로 강조표시된다.

launch는 Coroutine Scope 내에서만 실행될 수 있기 때문에, 만약 이 코드에서 runBlocking을 제거하거나 작성하는 것을 잊는다면, launch 호출 시에 애러가 발생할 것이다.

3줄 요약 :

runBlocking: 코루틴 환경 만들기 (메인 스레드 차단).
launch: 비동기 작업 시작하기 (다른 작업과 동시에 실행).
delay: 일시중단 (스레드는 차단하지 않고 쉬기).

profile
정답을 모르지만 답을 찾는 법을 알고, 그 답을 찾아낼 것이다. 그럼 괜찮지 않은가? -크리스 가드너-

0개의 댓글