관리 메뉴

hyeals study

코루틴 이해하기 2 본문

코틀린

코루틴 이해하기 2

hyeals 2020. 6. 19. 16:59

코루틴과 스레드 비교

코루틴

  1.  기본 옵션: 협력형이며 병행적으로 동작하지 않음(옵션 조절 가능)

  2. 스케줄러가 실행 시점을 결정하는 것이 아니라 프로그래머이벤트에 의해서 실행 및 지연(suspend), 재개(resume)시점이 결정

  3. 비선점형 멀티 태스크

  4. 동시성(concurrency)제공

  5. 독립적 스택을 가질 수도 있으나 일반적으로 스택을 다시 생성하지 않음

스레드

  1. 개수에 따라 완전히 병행적으로 동작할 수 있음

  2. OS의 스케줄러가 실행 시점결정함 (스케줄러가 선점할 수 있음)

  3. 선점형 멀티태스크

  4. 멀티 프로세싱

  5. 병행성(Parallelism) 제공

  6. 스레드별로 독립적인 스택을 가짐


간단한 코루틴 예시

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
Comments