728x90
코루틴 (Coroutine)
- 코틀린에서 기본적으로 제공하는 비동기처리 라이브러리
- 루틴 (Routine) : 하나의 개별적인 작업을 의미
- 코루틴은 넌블로킹 코드 (Non - Blocking Code), 비동기 코드를 마치 동기 코드처럼 쉽게 작성하면서도 비동기 효과를 낼 수 있게 한다.
- 문맥 교환 없이 루틴을 일시 중단하고 다른 루틴을 실행할 수 있다.
블로킹 코드 (Blocking Code)
- 애플리케이션 실행 시 운영체제 대기 큐에 들어가면서 요청에 대한 시스템 콜이 완료된 후에 응답할 수 있는 코드
넌블로킹 코드 (Non-blocking Code)
- 애플리케이션 실행 시 운영체제 대기 큐에 들어가지 않고 바로 요청에 대한 결과를 반환할 수 있는 코드
- 스레드와 같은 기법으로 구성하기에 성능은 뛰어나지만 코드가 복잡해져서 안전하지 못한 코드가 될 확률이 높음
동기 코드 (Synchronous)
- 스레드가 실행되기 전에 특정 작업이 완료되기까지 기다려야 하는 코드
- blocking, 혹은 non-blocking 방식으로 구현 가능
비동기 코드 (Asynchronous)
- 스레드가 실행될 때 다른 작업을 기다릴 필요 없고 작업이 완료되면 콜백을 통해 결과를 알려주는 코드
코루틴 빌드 하는 방법
1. launch
- 코루틴 빌더 (새로운 코루틴 생성함)
- 코루틴의 상태를 파악할 수 있는 Job 객체를 반환한다.
- GlobalScope : 생명주기가 애플리케이션에 종속되어있으므로 애플리케이션 종료 시 같이 종료된다. (process가 살아있는 한 계속 유지된다.) → 취소되지 않는 동작을 원할 때 사용
- CoroutineScope : 애플리케이션의 생명주기와는 상관 없다. (되도록이면 CoroutineScope를 쓰는 것을 권장)
import kotlinx.coroutines.*
fun main() {
//새로운 코루틴 생성 -> 백그라운드에서 실행됨 -> 코루틴의 상태를 확인 가능한 Job 객체 반환
var job = CoroutineScope(Dispatchers.Default).launch {
delay(2000)
println("in Background")//2초후에 출력
}
println("in Foreground")//바로 출력
println("isActive : ${job.isActive}, isCompleted : ${job.isCompleted}")
Thread.sleep(3000)//3초 대기
println("isActive : ${job.isActive}, isCompleted : ${job.isCompleted}")
/* 결과 :
in Foreground
isActive : true, isCompleted : false
in Background
isActive : false, isCompleted : true
*/
}
2. async
- launch와 다르게 Deferred<T>를 통해 결과값을 반환한다.
- await() 등의 함수를 통하여 지연된 결과값을 받는 것이 가능하다.
import kotlinx.coroutines.*
fun main() {
//새로운 코루틴 생성 -> 백그라운드에서 실행됨 -> 코루틴의 상태를 확인 가능한 Job 객체 반환
CoroutineScope(Dispatchers.Default).async {
var a = async(Dispatchers.Default) {
delay(1000)
"Completed"
}
println("first")//바로 출력
println(a.await())//1초 뒤 출력
}
//프로세스 종료 방지
Thread.sleep(2000)
/* 결과 :
first
Completed
*/
}
728x90
'Kotlin' 카테고리의 다른 글
[코틀린] 표준 라이브러리 확장 함수 5가지 (let, also, apply, run, with) (0) | 2020.10.04 |
---|---|
[코틀린] 배열 평탄화 flatten() (0) | 2020.10.04 |
[코틀린] 비트 연산자 (0) | 2020.09.28 |
[코틀린] 배열 정렬하기 (0) | 2020.09.26 |
[코틀린] 배열 (0) | 2020.09.26 |
댓글