Coroutine, 코루틴이란?

98oys·2022년 7월 21일
0

language

목록 보기
4/9

코루틴이란

launch, async는 코루틴 작업을 실행하는 명령어입니다.

괄호 안의 코드들이 비동기적으로 수행됩니다.

async 키워드는 반환 값이 있지만, launch 키워드는 반환 값이 없습니다.

코루틴에서는 runBlocking을 사용하지 않는것이 좋습니다.
runBlocking() 함수는 어떤 코드 블록 내 작업이 완료되기를 기다리는 방법중 가장 간단합니다.
하지만 안드로이드의 경우 이 함수를 메인 스레드에서 사용하여 시간이 오래걸리는 작업을 수행할 경우 ANR이 발생할 수 있습니다.

공식 문서의 내용입니다.

Runs a new coroutine and blocks the current thread interruptibly until its completion.
This function should not be used from a coroutine. It is designed to bridge regular blocking code to libraries that are written in suspending style, to be used in main functions and in tests. 
The default [CoroutineDispatcher] for this builder is an internal implementation of event loop that processes continuations in this blocked thread until the completion of this coroutine.

한글로 번역하면 아래와 같습니다.

새로운 코루틴을 실행하고 완료 될 때까지 현재 스레드를 차단합니다.
이 기능은 코루틴에서 사용해서는 안됩니다. 정기적인 블로킹 코드를 일시중단 스타일로 작성된 라이브러리에 연결하여 ‘main’ 함수와 테스트에 사용하도록 설계되었습니다.
이 빌더의 기본 [CoroutineDispatcher]는 이 코루틴이 완료 될 때까지 차단 된 스레드에서 연속적으로 처리하는 이벤트 루프의 내부 구현입니다.

현재의 스레드를 차단하며 일반적인 코루틴에서는 사용해서는 안되고 'main'함수와 테스트 용도로만 사용하도록 만들어진 함수라 명시되어있습니다.

스레드를 차단하는 것은 사용자의 입력을 처리하는 못하는 상황이므로 ANR이 발생하게 됩니다.

코루틴의 장점은 일시 중단입니다.
일시 중단 기능으로 하나의 내에서 여러가지 루틴들을 처리할 수 있습니다. 기존에 스레드를 여러개 처리하는 방식보다는 훨씬 효율적인 방법임을 알 수 있습니다.

하지만 runBlocking은 차단이므로 코루틴의 장점이 사라져버립니다.

결론 runBlocking() 함수를 쓰지말고 대신 coroutineScope(), withContext() 함수를 사용하면 됩니다.

profile
Android Developer, Department of Information and Communication Engineering, Inha University

0개의 댓글