본문 바로가기
코틀린

코루틴을 사용한 동시성, 병렬처리 - 2

by RWriter 2022. 1. 14.
반응형

지난 시간에는 코루틴이 무엇인지? launch 를 사용한 동시처리, 병렬처리

그리고 delay, sleep 의 차이를 예를 들어 context, dispatcher 까지 폭넓게 살펴봤다.

 

코루틴을 사용한 동시성, 병렬처리 - 1

비동기, 논블록킹을 다룰 수 있는 기술은 매우 중요하다. 모바일 웹 화면의 경우 기본은 싱글 스레드로 작동하는데 비동기,논블록킹을 적용하지 않으면 화면의 여러 인터렉션을 동시에 처리할

thisdev.tistory.com

 

 

이번에는 비동기 처리 (async) 를 어떻게 하는지 짧게 살펴보도록 하겠다.

suspend fun parallelAsync_multiple() = coroutineScope {
    val a1: Deferred<String> = async {
        delay(1000)
        "job1"
    }
    val a2: Deferred<String> = async {
        delay(1000)
        "job2"
    }
    println("print same time: ${a1.await()}")
    println("print same time: ${a2.await()}")
}

/**
print same time: job1
print same time: job2
**/

 

코루틴 관련 내용을 걷어내고 보면 마치 동기 코드를 짜는것 같다. 위 코드는 총 2초가 걸리지 않고 코루틴으로 돌아가기 때문에 1초밖에 안걸린다.

 

async 함수

launch 와 달리 async 라는 함수를 사용하여 코루틴을 만들고 있다.

async 는 launch 와 같이 코루틴 빌더이며, suspend 함수가 아니다. 

 

(코루틴 안에서 suspend 함수를 만났을때 제어권이 넘어간다는 것이지 코루틴은 suspend 함수가 아니다.)

 

그리고 launch 와 달리 async 블록 안에 있는 값 타입을 감싼 Deferred<T> 형태로 응답한다.

 

코드를 이어 가려면 언젠가는 값을 받아와야 하는데, Deferred의 await() 함수를 사용한다.

 

 

async 코루틴의 응답 타입이 같다면 awaitAll() 을 사용해서 한번에 값을 받아올 수도 있다.

suspend fun parallelAsync_list() = coroutineScope {
    val deferedList: List<Deferred<String>> = (1..10).map {
        async {
            delay(1000)
            "job$it"
        }
    }
    println("print after 1 second: ${awaitAll(*deferedList.toTypedArray())}")
}

/**
print after 1 second: [job1, job2, job3, job4, job5, job6, job7, job8, job9, job10]
**/
반응형

댓글