Coroutine

이하은·2022년 4월 8일
0

KotlinStudy

목록 보기
2/3

스레드를 경량화한 새로운 도구
동시성 프로그래밍 개념을 코틀린에 도입한 것

코루틴에서 스레드는 단지 코루틴이 실행되는 공간을 제공하는 역할을 하므로,
하나의 스레드에 여러 개의 코루틴이 존재할 수 있다.

코루틴 1이 작업을 하는 도중에 코루틴 2로 넘겨도, 코루틴 1이 잠시 멈출 뿐,
공간을 제공한 스레드는 계속 움직이게 된다.

스레드만 활용하여 이 구조를 처리하면 스레드간의 전환중 컨텍스트 스위칭이 일어나 성능 저하가 발생한다

코루틴은 이런 컨텍스트 스위칭을 하나의 스레드에서 처리하므로 성능 저하가 적고, 동일한 구조에서는 스레드보다 훨씬 적은 자원을 소모한다.

글로벌 스코프

앱의 생명 주기와 함께 동작하기 때문에 앱이 실행되는 동안은 별도의 생명 주기 관리가 필요하지 않다. 만약 앱의 시작부터 종료될 때 까지 혹은 장시간 실행되어야 하는 코루틴이 있다면 GlobalScope를 사용하면 된다.

GlobalScope.launch {
	//이곳에 코드를 작성
}

코루틴 스코프

버튼을 클릭해서 서버의 정보를 가져오거나 파일을 여는 용도라면 필요할 때만 열고 완료되면 닫는 CoroutineScope를 사용해야 한다.

Coroutine(Dispatchers.IO).launch {
	// 이미지를 불러오는 등의 코드를 처리
}

디스패처 : 코루틴이 실행될 스레드를 정하는 디스패처는 IO, Main, Default, Unconfined 등이 있지만 Io 와 Main 을 잘 조합하여 사용하면 된다

Dispatcher.IO : 이미지 다운로드, 파일 입출력 등에 최적화 되어있는 디스패처
Dispatcher.Main : 안드로이드의 기본 스레드에서 코루틴을 실행하고 UI와 상호작용에 최적화 되어있는 디스패처
Dispatcher.Default : CPU를 많이 사용하는 작업을 백그라운드 스레드에서 실행하도록 최적화되어있는 디스패처
Dispatcher.Unconfined : 자신을 호출한 컨텍스트를 기본으로 사용하고, 중단하거나 다시 실행하는 시점에 컨텍스트가 바뀌면 자신의 컨텍스트도 다시 실행하는 특수한 컨텍스트

Launch 와 상태 관리

코루틴은 launch 와 async 로 시작할 수 있는데, launch 는 상태를 관리할 수 있고, async는 상태를 관리하고 연산 결과까지 반환 받을 수 있다.
launch는 호출하는 것만으로 코루틴을 생성하고, 반환되는 job 을 변수에 저장해두고 상태 관리용으로 사용할 수 있다.

cancel : 말그대로 코루틴을 멈추는 상태관리 메서드
join : 코루틴 스코프 안에 선언된 여러개의 launch 블록은 모두 새로운 코루틴으로 분기되면서 동시에 처리되기 때문에, 이를 방지하기 위해 join 메서드를 사용하여 순차적으로 실행한다.

async와 반환값 처리

async는 코르틴 스코프의 연산 결과를 받아서 사용할 수 있다. 예를 들어, 시간이 오래 걸리는 2개의 코루틴을 async로 선언하고, 결과값을 처리하는 곳에서 await 함수를 사용하면 결과 처리가 완료된 후에 await을 호출한 줄의 코드가 실행된다.

suspend

suspend 키워드로 선언된 함수가 호출되면 이전까지의 코드 실행이 멈추고, suspend 함수의 처리가 완료된 후에 멈춰있던 원래 스코프의 다음 코드가 실행된다.

withContext

suspend 함수를 코루틴 스코프에서 호출할 때, 호출한 스코프와 다른 디스패처를 사용할 때가 있는 경우, 디스패처를 변경할 수 있다.

출처 : 이것이 안드로이드다 개정판 with 코틀린 (고돈호 지음)

profile
이하은

0개의 댓글