본문 바로가기

coroutine

코루틴이란?

코루틴(Coroutine) 이란?

 

코루틴을 처음 접하게 된다면 코루틴에서 "코" 를 코틀린의 "코" 로 떠올리기 쉬워 코틀린언어에 종속된 기술로 생각하시는 분들이 많습니다. 

하지만 코루틴에서 Co 는 "함께, 서로" 라는 의미로 routine (규칙적인 일 또는 작업의 집합) 과 합쳐져서 함께 동작하면 규칙있는 일의 순서를 뜻합니다.

 

아래는 위키피디아에서 코틀린을 다음과 같이 정의하고 있습니다.

실행의 지연과 재개를 허용함으로써,
비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소 
(출처: 위키피디아)

 

따라서 코틀린을 이해하기 위해서는 비선점적 멀티태스킹과 서브 루틴에 대해서 알아야 합니다.

 

비선점형 멀티태스킹과 선점형 멀티태스킹

비선점형: 하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없다. (코루틴)

선점형    : 하나의 프로세스가 다른 프로세스 대신에 CPU를 강제로 차지할 수 있다. (쓰레드)

 

즉 코루틴은 병행성( =동시성)은 제공하지만 병렬성은 제공하지 않습니다.

 

병행성( = 동시성) 1. 동시에 실행되는 것처럼 보인다.
2. Logical Level에 속한다.
3. Single Core 사용
4. 물리적으러 병렬이 아닌 순차적으로 동작
5. 사용자는 마치 동시에 동작하는 것처럼 느껴짐
병렬성 1. 실제로 동시에 처리됨
2. Pysical Level에 속한다.
3. 오직 Multi Core 에서만 가능

 

 

따라서 코루틴은 쓰레드 내 Context switching 없이 여러 코루틴을 실행, 중단, 재개할 수 있는 상호작용을 통해

병행성을 갖기에 쓰레시와 메모리 사용이 줄어들고 개발자가 직접 작업을 구성할 수 있습니다.

 

루틴이란?

루틴은 하나의 Task 나 Function 으로 이해할 수 있으며 메인루틴과 서브루틴으로 나뉩니다.

 

메인 루틴: 프로그램 전체의 개괄적인 동작으로 main 함수에 의해 수행되는 흐름

서브 루틴: 반복적인 기능을 모은 동작으로 main 함수 내에서 실행되는 개별 함수의 흐름

 

코루틴이 쓰이는 이유

코루틴은 멀티쓰레딩 문제를 간소화된 비동기 작업방식으로 해결하기 위해 개발되었습니다.

비동기 작업은 코루틴 뿐만아니라 RxJava 를 통해서도 수행할 수 있는데 RxJava 는 러닝커브가 높기 때문에 비교적 쉬운 코루틴을 사용하는 경우가 많습니다.

 

하지만 무조건 코루틴을 사용하기 보다는 상황에 맞게 사용하는게 중요합니다.

아래는 Fabio Collini 가 제시한 어떤 방식을 채택할지에 대한 기준입니다.

1. 이미 RxJava를 사용하고 있고 잘 동작한다면 RxJava를 사용한다.
2. 아키텍처가 Reactive Stream을 기반으로 하는 경우 RxJava를 사용한다.
3. 프로젝트가 Kotlin Native를 사용한 멀티플랫폼인 경우 코루틴을 사용한다.
4. 코드 베이스가 Java / Kotlin인 경우 RxJava를 사용한다.
5. 이 외에는 코루틴을 사용한다.

 

 

코루틴의 장점

위의 설명들을 종합하여 코루틴의 장점을 정리하면 다음과 같습니다.

 

1. Routine간 협력을 통한 비선점적 멀티태스킹

 

Coroutine을 사용하면 비동기로 Routine을 실행하고 일반적인 Sub Routine과 다르게 진입과 탈출이 자유로워 Routine간 협력을 통해

비선점적 멀티태스킹을 가능하게 합니다.


2. 동시성 프로그래밍 지원


동시성 프로그래밍은 2개 이상의 프로세스가 동시에 작업하는 상태를 말하는데,

코루틴은 단일코어에서 실행되기에 각 루틴의 교차배치합니다.
다중 쓰레드는 각 쓰레드간 Context switching 비용이 발생하지만, 코루틴의 하나의 쓰레드내에서 스케줄링이 가능합니다.

그래서 경량 쓰레드 라고도 불리어 집니다.


3. 쉽고 가독성 있게 작성할 수 있는 비동기 처리

 

비동기 코드를 작성할때는 success 처리와 error 처리를 해야하는 부수적인 코드 작성이 필요합니다.

코루틴은 예측 가능한 프로그래밍을 할 수 있따는 점에서 동기 코드 진행 흐름과 동일하게 예외처리가 가능하며

디버깅 측명에서도 장점이 있습니다.

또한 멀티쓰레드와 비교했을때 쓰레드간 통신과 콜백 구조로 코드가 흐르지 않기 때문에 코드 흐름 파악이 쉽습니다.

 

 

출처

https://dev.gmarket.com/82

https://mochaive.medium.com/coroutine-5119fda3bc65