Programming Language/Kotlin
[Kotlin] Kotlin Coroutines에서 Launch 와 Async
Tenacity_Dev
2024. 3. 1. 00:31
728x90
오늘은 Kotlin Coroutines에서 Launch 와 Async에 대해서 알아보자.
launch와 async는 모두 Kotlin에서 코루틴을 시작하는 기능이다.
차이점은 launch는 실행하면 결과 값을 전달하지 않는 반면 , async는 반환 결과 를 얻기 위해 Java에서 future를 사용하는 것처럼 코루틴의 결과를 반환하는 함수가 Deferred<T>있는 의 인스턴스를 반환한다는 것이다.
Launch
val job = GlobalScope.launch(Dispatchers.Default) {
// do something and do not return result
}
작업 상태를 가져오거나 취소하는 데 사용할 수 있는 작업 개체를 반환한다.
위의 실행 예에서 우리는 무언가를 해야 하고 결과를 반환 하지 않아야 한다.
Async
val deferredJob = GlobalScope.async(Dispatchers.Default) {
// do something and return result, for example 10 as a result
return@async 10
}
val result = deferredJob.await() // result = 10
여기서는 await().를 사용하여 결과를 얻었다.
비동기에서도 Deferred작업 개체를 사용하여 작업 상태를 가져오거나 취소할 수 있다.
또 다른 차이점은 예외 처리 측면이다.
private fun doSomethingAndThrowException() {
throw Exception("Some Exception")
}
예외를 던지는 코드를 예시로 들어보자.
Launch의 예외 발생 및 처리
Launch의 경우 예외가 올 경우
GlobalScope.launch {
doSomethingAndThrowException()
}
이 경우 예외가 발생했다는 것을 알리면서 응용프로그램이 충돌하여 진행중인 함수를 중단한다.
GlobalScope.launch {
try {
doSomethingAndThrowException()
} catch (e: Exception) {
// handle exception
}
}
위와 같이 예외를 처리할 수 있다.
Async의 예외 발생 및 처리
Async의 경우 예외가 올 경우
GlobalScope.async {
doSomethingAndThrowException()
}
응용 프로그램이 충돌 하지 않고, 예외는 자동으로 삭제된다.
GlobalScope.async {
try {
doSomethingAndThrowException()
} catch (e: Exception) {
// handle exception
}
}
위와 같이 예외를 처리할 수 있다.
정리
Launch | Asych |
실행하고 잊어버린다. | 작업을 수행하고 결과를 반환한다. |
launch{}는 Job을 반환하지만 결과 값을 전달하지 않는다. | async{} 는 Deferred<T>의 인스턴스를 반환한다. Deferred<T>는 코루틴의 결과를 반환하는 await() 기능이 있다. |
실행 블록 내부에 예외가 발생하면 이를 처리하지 않은 경우 애플리케이션이 충돌한다. | 비동기 블록 내부에 예외가 발생하면 결과 Deferred 내부에 저장되고 다른 곳에서는 전달되지 않으며 처리하지 않는 한 자동으로 삭제된다. |
참고
https://amitshekhar.me/blog/launch-vs-async-in-kotlin-coroutines
728x90