마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

코루틴으로 동기 처리시

0 추천
코루틴을 사용하는데 무조건 동기로 해야되는 처리인경우

val apiCall1 = async(start=CoroutineStart.Lazy) { viewmodel.apicallMethod1() }

val apiCall2 = async(start=CoroutineStart.Lazy) { viewmodel.apicallMethod2() }

apiCall1.start()
apiCall2.start()

apiCall1.await().collect { // 작업 처리}
apiCall2.await().collect { // 작업 처리}

 

이렇게 하는게 맞나요? 현재는 이걸 몰라가지고
그냥 이런식으로 처리해놨었는데
 viewmodel.apicall1.collect {
   // 작업처리
    viewmodel.apicall2.collect {
     // 작업처리
      }
}
수원통학러 (3,570 포인트) 님이 2022년 8월 25일 질문

1개의 답변

0 추천
코루틴의 비동기 방식입니다. 동기방식과 혼동하시면 안됩니다. 님이 말하는 것은 structure concurrency라고 ㅎ하는 비동기 개념 중의 하나로 코루틴의 특징이기도 합니다.
그리고 예제로 올리신 코드는suspend 함수와 flow 가 섞여 있습니다.
Suspend function을 하나 호출한 후 그 다음에 다른 suspend function을 호출하려면 그냥 순차적으로 하시면 됩니다. Async는 굳이 필요하지 않습니다.
실제로 사용하는 코드를 올려보세요. 예제는 사용할 수 없는 코드입니다.
spark (224,800 포인트) 님이 2022년 8월 25일 답변
https://kotlinlang.org/docs/composing-suspending-functions.html#structured-concurrency-with-async
위에코드는 여기보고 했고 현재 처리해놓은 작업은 지금 저 상태 그대로입니다
// 작업처리라고 되어있는곳은 그냥 ui 처리라서요 주석으로 그냥 저렇게 생략해놓은 상태입니다
apiCall1.await().collect {} 같은 형태는 없어요.
suspend function이면  .await, flow면 .collect를 사용하면 될 것 같은데, 두개를 합쳐쓴 건 이상해 보여요.

코루틴페이지에 나온 예제 중, 아래 코드 형태로 만드시면 됩니다.

suspend fun concurrentSum(): Int = coroutineScope {
    val one = async { doSomethingUsefulOne() }
    val two = async { doSomethingUsefulTwo() }
    one.await() + two.await()
}

주의할 점은 async 들을 모두 만들고 나서 await들을 호출하셔야 합니다.  이게 섞이면 펄포먼스가 달라집니다.

바람직한 순서
async1 = async { api1() }
async2 = async { api2() }

async1.await()
async2.await()

바람직하지 않은 순서
async1 = async { api1() }
async1.await()

async2 = async { api2() }
async2.await()

api1을 호출하고 나서 api2를 호출하셔야 한다면 위의 방식보다는 그냥 suspend function을 차례대로 호출하시면 됩니다.

api1()
api2()
...