hyeals study
코루틴 이해하기 2 본문
코루틴과 스레드 비교
코루틴
-
기본 옵션: 협력형이며 병행적으로 동작하지 않음(옵션 조절 가능)
-
스케줄러가 실행 시점을 결정하는 것이 아니라 프로그래머나 이벤트에 의해서 실행 및 지연(suspend), 재개(resume)시점이 결정됨
-
비선점형 멀티 태스크
-
동시성(concurrency)제공
-
독립적 스택을 가질 수도 있으나 일반적으로 스택을 다시 생성하지 않음
스레드
-
개수에 따라 완전히 병행적으로 동작할 수 있음
-
OS의 스케줄러가 실행 시점을 결정함 (스케줄러가 선점할 수 있음)
-
선점형 멀티태스크
-
멀티 프로세싱
-
병행성(Parallelism) 제공
-
스레드별로 독립적인 스택을 가짐
간단한 코루틴 예시
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis
// 진입점: main 함수
// suspend를 사용하고 있는 함수를 처리하기 위해서
// runBlocking으로 감싸주거나 코루틴 빌더를 이용해서 구성해야함
fun main (args: Array<String>) = runBlocking<Unit> {
val time = measureTimeMillis { // measureTimeMillis: 시스템에서 제공해주는 람다식(블록 안에 있는 코드들의 수행시간을 알려줌)
val one = doSomethingUsefulOne()
val two = doSomethingUsefulTwo()
println("The answer is ${one + two}")
}
println("Completed in $time ms")
}
suspend fun doSomethingUsefulOne(): Int {
delay(1000L)
return 13
}
suspend fun doSomethingUsefulTwo(): Int {
delay(1000L)
return 29
}
☞ 코루틴에 대한 특정 형식을 정해주지 않으면 기본적으로 순차적으로 루틴이 진행됨
☞루틴 진행: doSomethingUsefulOne() -> doSomethingUsefulTwo()
실행 결과
비동기적으로 수행하는 코루틴 예시
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis
fun main (args: Array<String>) = runBlocking<Unit> {
val time = measureTimeMillis {
val one = async { doSomethingUsefulOne() } // async: 코루틴 빌더 중 하나, 비동기적 처리를 할 수 있게 함
val two = async { doSomethingUsefulTwo() }
println("The answer is ${one.await() + two.await()}")
}
println("Completed in $time ms")
}
suspend fun doSomethingUsefulOne(): Int {
delay(1000L)
return 13
}
suspend fun doSomethingUsefulTwo(): Int {
delay(1000L)
return 29
}
☞ async를 통해 비동기적 처리를 했기 때문에 어떤 일이 먼저 끝날지 알 수 없음.
☞ println부분에서 실행 결과 값을 받아서 연산 후 출력 해야하기 때문에 await를 통해서 각각의 수행의 결과값을 받은 후 대기함
※ 두 개의 suspend function이 동시성을 갖고 수행되며 이 루틴들은 하나의 Main Thread안에 있음
실행 결과
☞ 비동기적 처리를 함으로서 동시성을 제공하기 때문에 수행시간이 더 짧음
☞ 만약 위 코드에서 delay(1000L)부분을 Thread.sleep(1000L)로 바꾸면 이 코드는 스레드 자체(여기서는 메인 스레드)를 1초 동안 중지 시키는 것이기 때문에 비동기적 처리임에도 불구하고 순차적으로 수행하는 것과 수행시간의 차이가 크게 나지 않는다. (비슷하다고 볼 수 있음)
Thread.sleep(1000L)으로 바꿨을 때의 실행 결과
'코틀린' 카테고리의 다른 글
코루틴 이해하기 1 (0) | 2020.06.19 |
---|---|
Data 클래스 (0) | 2020.06.16 |
map 함수 (0) | 2020.06.15 |
[코틀린] 제네릭 타입 파라미터 (0) | 2020.02.28 |
[코틀린] 고차 함수 (0) | 2020.02.27 |