Cómo ejecutar Flux en paralelo, pero recopilar los resultados en secuencia.
Quiero ejecutar Flux en paralelo, pero recopilar el resultado en secuencia. Supongamos que tengo un flux de [3,2,1], después de realizar alguna tarea en paralelo, espero que el resultado siga siendo [3,2,1].
val mono = Flux.fromIterable(3 downTo 1)
.map { it.toString() }
// esto devolverá el mismo número
.flatMap { number -> task(number) }
.doOnNext { println("Número de $it") }
// Obtuve 1, 3, 2 lo cual es bueno porque quiero que se ejecute en paralelo
.collectList()
.doOnNext { println(it) }
// Todavía obtuve [1,3,2], pero quiero que sea [3,2,1] según el orden iterable.
.block()
davy.ai
Para ejecutar un Flujo en paralelo pero recoger el resultado en secuencia, puede utilizar el operador
groupJoin()
para unir los resultados en el orden definido por el iterable original. Aquí está un ejemplo de código:En este ejemplo, usamos
flatMap
consubscribeOn(Schedulers.parallel())
para ejecutar las tareas en paralelo. Luego usamosgroupBy
para agrupar los resultados por el valor original (por ejemplo, “1”, “2”, “3”). También usamosgroupJoin
para unir los grupos en el orden original, utilizando un Flux separado con enteros del 1 al 3. Finalmente, aplanamos el Flujo de valores agrupados y los recogemos en una lista.El resultado debería ser la lista original
[3,2,1]
en el orden definido por el iterable. Note que los operadoresdoOnNext
se utilizan para imprimir la salida, pero no son necesarios para la operación real.