Android/Coroutine

[Coroutine] async{}/await() 사용 시 주의사항

네모메모 2024. 2. 18. 12:40
반응형

 

 

 

 

 

 

 

 

아래 두 코드는 다른 방식으로 동작합니다.

1) async { api호출함수() }을 여러 개 사용 후, await() 여러 개를 호출하는 코드

vs

2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드

 


 

 

 

1) async { api호출함수() }을 여러 개 사용 이후, await() 여러 개를 호출하는 코드

- getUserApi()와 getPeedApi()를 병렬로 호출하고, 각각의 작업이 완료될 때까지 대기합니다. 따라서 getUserApi()와 getPeedApi() 함수 호출은 동시에 이루어질 수 있으며, 두 작업이 완료되는 순서에 따라 데이터를 받습니다.

suspend fun fetchData() {
    coroutineScope {
        val userDeferred = async { getUserApi() }
        val peedDeferred = async { getPeedApi() }

        val user = userDeferred.await()
        val peed = peedDeferred.await()

        // 이후 user와 peed를 이용한 로직을 여기에 작성하실 수 있습니다.
    }
}

 

 

 

vs

 

2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드

- getUserApi()와 getPeedApi()를 각각 비동기적으로 호출하지만, await 함수를 호출하여 첫 번째 작업인 getUserApi()가 완료될 때까지 대기합니다. 따라서 getUserApi() 작업이 완료된 후에 getPeedApi() 작업을 실행하게 됩니다. 

suspend fun fetchData() {
    coroutineScope {
        val userDeferred = async { getUserApi() }.await()
        val peedDeferred = async { getPeedApi() }.await()

        val user = userDeferred
        val peed = peedDeferred
    }
}

 

 

결론

  • await()를 각각의 결과에 대해 호출하면, 먼저 호출된 await()의 작업이 완료될 때까지 기다린 후 결과를 받습니다.
  • 모두 코루틴을 사용하여 비동기적으로 동작하며, 동시성을 보장하지만,
    1번 함수는 두 작업을 병렬로 실행하므로 순서를 보장하지 않고
    2번 함수는 getUserAPI()를 기다린 후에 getPeedApi()를 호출하기 때문에 순서를 보장한다는 차이가 있어보인다.

 

 

 

 

출처


https://androidpangyo.tistory.com/199

반응형