Estou escrevendo um aplicativo de back-end no Kotlin.
Para acelerar, atualmente estou confiando no RxKotlin no servidor para executar paralelamente tarefas de E / S, como chamadas de banco de dados e API. O código geralmente se parece com isso.
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()
No entanto, como o trabalho não funciona realmente com vários eventos (apenas singles), o Rx se sente um pouco confuso e apenas adiciona um monte de clichê (também causa complicações se eu quiser retornar um valor nulo e, às vezes, atrapalhar o rastreamento da pilha )
Estou pensando em remover Rx e usar Executors
(ou threads) para paralelismo insteada. Existem considerações de desempenho a serem consideradas aqui?
Exemplo no que estou 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
}
E usando-o assim:
waitAll(listOf(callable1, callable2))
Ou talvez usando threads regulares e se juntar a eles?
threads.forEach{
it.start()
}
threads.forEach{
it.join()
}
Ou por que não fluxos?
listOf(callable1,callable2)
.parallelStream()
.map{it.call()}
.collect(Collectors.toList())