Programming Language/Kotlin

[Kotlin] Flow zip 연산자로 long- running tasks in parallel 처리하기

Tenacity_Dev 2024. 3. 2. 19:59
728x90

Kotlin Flow의 zip 연산자란

Zip 연산자는 지정된 함수를 통해서 두 흐름 컬럭션의 방출을 함께 결합하고 이 함수의 결과를 기반으로 각 조합에 대해 단일 항목을 방출하는 연산자이다.

 

예제 코드

val flowOne = flowOf(1, 2, 3)
val flowTwo = flowOf("A", "B", "C")

flowOne.zip(flowTwo) { intValue, stringValue ->
    "$intValue$stringValue"
}.collect {
    println(it)
}

 

출력

1A
2B
3C

 

Android의 실제 사용 사례 

두 작업을 병렬로 실행하고 두 작업이 모두 완료되면 단일 콜백에서 두 작업의 결과를 원하는 경우

 

장기 실행 작업 1

private fun doLongRunningTaskOne(): Flow<String> {
    return flow {
        // your code for doing a long running task
        // Added delay to simulate
        delay(5000)
        emit("One")
    }
}

 

장기 실행 작업 2

private fun doLongRunningTaskTwo(): Flow<String> {
    return flow {
        // your code for doing a long running task
        // Added delay to simulate
        delay(5000)
        emit("Two")
    }
}

 

zip연산자를 사용하는 경우

fun startLongRunningTask() {
    viewModelScope.launch {
        doLongRunningTaskOne()
            .zip(doLongRunningTaskTwo()) { resultOne, resultTwo ->
                return@zip resultOne + resultTwo
            }
            .flowOn(Dispatchers.Default)
            .catch { e ->
                // handle exception
            }
            .collect {
                // result
            }
    }
}

 

출력

OneTwo

 

여기서는 zip 연산자를 사용했기 때문에 두 작업을 병렬로 실행하고 두 작업이 모두 완료되면 단일 콜백으로 두 작업의 결과를 제공한다.

Zip 연산자를 사용하여 두 개의 흐름 컬렉션을 압축하면 두 작업이 병렬로 실행된다. 그리고 둘 다 완료되면 결과를 얻는다. 이러한 방식으로 우리는 한 번에 두 흐름 컬렉션의 결과를 얻는다.

 

Kotlin Flow의 Zip 연산자의 장점:

  • 작업을 병렬로 실행한다.
  • 모든 작업이 완료되면 단일 콜백으로 작업 결과를 반환한다.

이 방법으로 우리는 작업을 병렬로 실행하기 위해 Kotlin의 Flow의 Zip 연산자를 사용할 수 있다.

 

참고

https://amitshekhar.me/blog/long-running-tasks-in-parallel-with-kotlin-flow

 

Long-running tasks in parallel with Kotlin Flow

In this blog, we will learn about how to run long tasks in parallel with Kotlin Flow in Android.

amitshekhar.me

 

728x90