Estoy escribiendo una aplicación de fondo en Kotlin.
Para acelerar las cosas, actualmente confío en RxKotlin en el servidor para realizar la ejecución paralela de tareas de E / S, como llamadas a bases de datos y llamadas a API. El código generalmente se ve así.
val singleResult1 = Single.fromCallable{
database.get(....)
}.io()
val singleResult2 = Single.fromCallable{
database.update(....)
}.io()
Single.zip(singleResult1, singleResult2){ result1: Result1, result2: Result2 ->
....
}
.flatMap{
//other RX calls
}
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.blockingGet()
Sin embargo, dado que no funciona realmente funciona con múltiples eventos (solo singles), Rx se siente un poco desordenado y solo agrega un montón de repeticiones (también causa complicaciones si quiero devolver un valor nulo y a veces podría estropear el seguimiento de la pila )
Estoy pensando en eliminar Rx y usar Executors
(o hilos) para el paralelismo insteada. ¿Hay alguna consideración de rendimiento a considerar aquí?
Ejemplo en lo que estoy pensando:
fun <T> waitAll(tasks: List<Callable<T>>, threadCount: Int = -1): List<T> {
val threads = if (threadCount == -1) tasks.size else threadCount
val executor = Executors.newFixedThreadPool(threads)
val results = executor.invokeAll(tasks).map {
it.get()
}
executor.shutdown()
return results
}
Y usándolo así:
waitAll(listOf(callable1, callable2))
¿O tal vez usando hilos regulares y unirlos?
threads.forEach{
it.start()
}
threads.forEach{
it.join()
}
¿O por qué no corrientes?
listOf(callable1,callable2)
.parallelStream()
.map{it.call()}
.collect(Collectors.toList())