Android/Coroutine

[Kotlin Coroutine][init] 5. kotlin.coroutines vs kotlinx.coroutines

네모메모 2024. 2. 22. 20:25
반응형

 

 

 

 

 

코루틴은 하나의 라이브러리에 있을 것 같지만 아니다!

 

1) 코틀린은 언어 차원에서 표준 라이브러리에 최소한의 저수준 API만 제공하고,

2) 다양한 다른 라이브러리에서 코루틴을 활용할 수 있도록 되었다.

 

 

 


 

 

1) 코틀린은 언어 차원에서 표준 라이브러리인 kotlinx.coroutines 

-  자유도를 보장하기 위해 필수 언어 차원에서의 최소한만 지원함

    ㄴ> 여기에는 suspendCoroutine, Continuation 등

    ㄴ> 라이브러리 개발자에게 적합

 

2) 다양한 다른 라이브러리

- 별도의 의존성을 추가해야 한다.

- 애플리케이션 개발자들에게 적합

- 이 중 JetBrains에서 개발한 kotlinx.coroutines에는 코루틴을 위한 많은 라이브러리가 대표적이다.

    ㄴ> 여기에는 launch, async 등을 포함한 고수준의 코루틴 요소들이 포함되어 있다.

 

 

 

 

kotlinx.coroutines   kotlinx.coroutines
언어 차원에서 표준 라이브러리 JetBrains에서 개발한 코루틴 라이브러리
컴파일러가 지원하며 코틀린 기본 라이브러리에 포함되어 있음
(= 의존성 추가 필요없음)
의존성을 별도로 추가해야 한다.
 suspendCoroutine, Continuation 등의 기본적인 것들과
suspend 키워드를 최소한으로 제공
launch, async, Deferred 등의 다양한 기능 제공
라이브러리 개발자에게 적합 애플리케이션 개발자들에게 적합
거의 모든 동시성 스타일이 허용됨 명확한 하나의 동시성 스타일을 위해 설계되어 있다.
 ex) 구조적 동시성(Structured Concurrency)
직접 사용하기 아주 어렵다. 사용하기 쉬우며, 동시성을 명확하게 구현할 수 있게 해 줌

 

 

더보기

여러 동시성 스타일들

  1. 스레드 기반 동시성(Thread-based Concurrency)
    - 가장 전통적인 동시성 패턴 중 하나
    - 각각의 작업을 별도의 스레드로 실행하여 동시성을 달성함
    - 대부분의 프로그래밍 언어와 플랫폼에서 지원하지만 스레드를 직접 관리하는 것이 어렵고, 공유 자원에 대한 동기화 문제가 발생할 수 있다.

  2. 이벤트 기반 동시성(Event-based Concurrency)
    - 이벤트 루프를 사용하여 이벤트가 발생할 때마다 해당 이벤트를 처리하는 방식으로 비동기적인 이벤트 핸들러를 사용하여 동시성을 처리
    - 주로 GUI 및 네트워크 프로그래밍에서 사용함.
    - 대표적으로 Node.js가 이 패턴을 채택

  3. 액터 기반 동시성(Actor-based Concurrency)
    - 액터라는 독립적인 실행 단위를 사용하여 동시성을 구현하는 방식으로,
       각 액터는 메시지를 주고받으며, 메시지를 받으면 해당 액터가 처리합니다. 액터는 내부 상태를 가지고 있으며, 동시적으로 실행될 수 있다.
    - Erlang과 Akka 프레임워크가 이러한 패턴을 지원함

  4. 데이터 병렬성(Data Parallelism)
    - 데이터 병렬성은 데이터를 분할하여 여러 처리 단위에 동시에 적용하는 방식
    - 이 방식은 SIMD(Single Instruction, Multiple Data) 명령어 집합을 사용하여 벡터 및 행렬 연산에 주로 사용

  5. 작업 기반 동시성(Task-based Concurrency)
    - 작업 또는 태스크 단위로 동시성을 처리하는 방식으로
      각 작업은 병렬로 실행될 수 있으며, 일반적으로 작업 큐 또는 스케줄러를 사용하여 관리됨
    - 대표적으로 Java의 Executor 프레임워크 및 .NET의 Task Parallel Library(TPL)가 이러한 패턴을 지원함

=> 이 외 여러 동시성 패턴이 존재하며, 각각의 장단점이 있으므로 언어, 플랫폼, 애플리케이션의 요구사항에 따라 적절한 동시성 스타일을 선택해야 함

 

 

더보기

구조적 동시성(Structured Concurrency)?

- 코루틴을 구성하고 관리하는 방식을 의미

- 코루틴을 계층적 구조로 구성하여 부모-자식 관계를 유지하고, 부모 코루틴이 자식 코루틴의 수명을 관리합니다. 이렇게 하면 부모 코루틴이 완료되기 전에 자식 코루틴이 모두 완료될 수 있도록 보장할 수 있다.

- kotlinx.coroutines 라이브러리는 구조적 동시성을 중심으로 설계됨

- [장점1] 구조적 동시성을 사용하면 코루틴의 수명을 명시적으로 관리할 수 있으며, 코루틴이 예외를 던질 때 해당 예외를 적절하게 처리할 수 있다.

- [장점2] 코루틴이 병렬로 실행되는 동시성 작업을 효과적으로 구성할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 


 

출처


 - https://discuss.kotlinlang.org/t/kotlin-coroutines-vs-kotlinx-coroutines/7937 

 - https://kotlinlang.org/docs/coroutines-overview.html#sample-projects

 - [Book] 코틀린 코루틴 : 안드로이드 및 백엔드 개발자를 위한 비동기 프로그래밍 마르친 모스카와 저 / 신성열 역 | 인사이트(insight) | 2023년 11월 01일 

 

 

 

반응형