Kotlin의 Coroutine은 어떻게 동작하는가

Chang W. Doh
TIL: Kotlin in practice (한국어)
3 min readApr 30, 2018
blocking 코드처럼 보이지만, coroutine을 이용하면 함수의 호출을 비동기적으로 처리할 수 있습니다.

DroidKnights 2018에서 발표한 ‘Kotlin의 코루틴은 어떻게 동작하는가' 세션의 슬라이드입니다.

Kotlin의 Coroutine은 suspend 키워드로 마킹된 함수를 CPS(Continuation Passing Style)로 변환하고, 이를 Coroutine Builder를 통해 적절한 스레드 상에서 시나리오에 따라 동작하도록 구성됩니다.

주의해야 할 점은 suspend function은 스레드와 스케쥴의 관리를 수행하는 것이 아니라 비동기 실행을 위한 중단(suspension) 지점의 정의라는 점입니다 코루틴은 중단 지점까지 비선점형으로 동작하기 때문에 실행 스케쥴이 OS에 의해 온전히 제어되는 스레드와는 다른 관점에서 보아야 합니다.

아래는 세션 이후에 받은 질문과 그에 대한 답변을 정리하였습니다.혹시 추가 질문이 있으시다면 아래 댓글로 달아주시면 고맙겠습니다.

Q. Coroutine은 스레드보다 빠른가요?

좋은 질문입니다. :)

A. 그럴 수도 있고, 아닐 수도 있습니다. :)

코루틴은 기본적으로 비동기 동작을 효율적으로 표현하기 위한 방법에 해당합니다. 비동기 실행의 표현이 간결해지면, 동시성이나 병렬 실행을 구현하는 코드 역시 좀 더 간단해지므로 그로부터 얻는 이득이 있다고 보는 것이 좀 더 나은 접근일 것입니다.

추가로 처리되는 데이터가 스레드 간의 복잡한 파이프라인을 타고 이동(스위칭)하거나, 많은 스레드가 필요할 때에도 시스템 리소스를 적절히 사용하여 실행이 가능합니다. (이 부분이 light-weight하다는 의미입니다.)

따라서, 비동기 동작이 필요한 상황에서 직접 스케쥴링을 하는 것보다 노력 대비 평균적으로 괜찮은 성능을 보여줄 것으로 기대할 수 있습니다.

Q. Coroutine은 스레드의 대용체인가요?

A. 정확히는 그렇지 않습니다.

코루틴의 실행 자체는 여전히 스레드 상에서 동작하므로 스레드의 대용체가 아닙니다. 위 답변에서 이미 말씀드렸듯이, 코루틴은 보다 간편하면서 효율적인 코드를 작성할 수 있는 프로그래밍 테크닉에 가깝고, 이것이 코루틴을 디자인하게된 본래 의미에 가깝다고 볼 수 있습니다.

RxJava와의 비교를 원하신 분들도 많으셨는데, 제가 RxJava는 해보지를 않아서 정확한 답을 드리기가 어렵네요. 혹시 나중에 Rx를 공부한다면 관련된 글을 써보도록 하겠습니다. :)

--

--

Chang W. Doh
TIL: Kotlin in practice (한국어)

I’m doing something looks like development. Community diver. ex-Google Developer Expert for Web 😎