개발 일기

코루틴 이해하기 본문

카테고리 없음

코루틴 이해하기

flow123 2024. 6. 20. 20:11

팀 코드에는 다른 시스템에(ex. 결제 -> 회원 서비스) 메시지를 전달할 때, 코루틴을 활용한다. 해당 코드를 작업 하면서, 코루틴을 공부한 내용을 정리해두었다.  코루틴을 이해하려면, 먼저 동기와 비동기를 이해해야 한다.

동기와 비동기 

특성 동기 프로그래밍 비동기 프로그래밍
실행 순서 작업이 순차적으로 실행됨 (이전 작업 완료 이후)
작업 간 순서가 중요하고, 결과가 즉시 필요할 때.
한 작업의 완료를 기다리지 않고, 다음 작업으로 넘어간다. 
작업이 완료되면, 코루틴/콜백 등을 통해 처리.
블로킹 여부 호출된 스레드를 차단함.
완료될 때까지 호출된 스레드가 기다려야 함.
호출된 스레드를 차단하지 않고 즉시 제어 반환하므로,
다른 작업을 그동안 진행함.
코드 복잡성 비교적 간단하고 직관적 복잡하며 관리가 필요
응답성 작업 중 응답이 차단될 수 있음 작업 중에도 응답성을 유지함
적합한 작업 단순한 작업, 순차적 의존성이 있는 작업 외부시스템과의 통신/I/O 바운드 작업, UI 응답성 요구 작업

 

코루틴이란?

코틀린에서 비동기 프로그래밍을 구현하는 방식이다. 공식 가이드의 서문에서는 코루틴을 이렇게 설명한다. 

 

A coroutine is not bound to any particular thread.
It may suspend its execution in one thread and resume in another one.
Coroutines can be thought of as light-weight threads, but there is a number of important differences that make their real-life usage very different from threads.


코루틴은 특정 스레드에서만 작동하지 않는다. 
A 스레드에서 실행되다가 중단하고, B 스레드에서 실행할 수 있다. 
코루틴은 경량 스레드를 묶어놓은 것과 같다. (의역하자면) 하지만 코루틴이 동작하는 방법은 스레드와 매우 다르다.  

 

If you write the same program using threads (remove runBlocking, replace launch with 
thread, and replace  delay with  Thread.sleep), it will consume a lot of memory. Depending on your operating system, JDK version, and its settings, it will either throw an out-of-memory error or start threads slowly so that there are never too many concurrently running threads.


코루틴은 JVM 스레드와 비교할 때, 리소스 소모량이 적다. 
스레드는 메모리를 많이 소모한다. 코루틴을 스레드처럼 쓰면 OOM 을 발생시킬 것이다. 

주요 개념

Coroutine Scope (코루틴 스코프) 

문서에서는 structured concurrency 라고 칭하는데, 코틀린이 코루틴을 다루는 방식은 구조적이다.

- 코루틴은 특정 코루틴 스코프 에서만 정의/실행 될 수 있다.

- 코루틴 스코프는 코루틴의 생명 주기를 관리한다. 

- 코루틴 스코프는 스코프 내의 모든 코루틴이 완료되어야, 완료할 수 있다. 이렇게, 코드에서 에러가 나는 것을 모두 감지하고 누락하는 경우가 없게 한다.

 

- launch: 코루틴 빌더

- delay: 스레드를 블록하지 않으면서 (non-blocking), 다른 코루틴들이 해당 스레드를 사용하게 해줌. 

- runBlocking: 코루틴 스코프의 구현체 중 하나. 

   runBlocking 내의 모든 코루틴이 실행 완료될 때까지 스레드가 블록됨 

   runBlocking 은 자주 사용되지 않는데, 이는 스레드가 비싼 리소스이고, 블로킹 하는 것이 비효율적이기 때문이다. 

 

 

 

코루틴에서 비동기적으로 사용하려면 suspend 를 써야 한다.

suspend 를 쓰면, 코드 실행을 suspend(중지) 했다가, resume(재개) 할 수 있다.

 

참고 

https://kotlinlang.org/docs/coroutines-overview.html

 

Coroutines | Kotlin

 

kotlinlang.org

 

Comments