Ich schreibe eine Backend-Anwendung in Kotlin.
Um die Arbeit zu beschleunigen, verlasse ich mich derzeit auf RxKotlin auf dem Server, um E / A-Aufgaben wie Datenbankaufrufe und API-Aufrufe parallel auszuführen. Der Code sieht normalerweise so aus.
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()
Da jedoch nicht wirklich mit mehreren Ereignissen (nur Singles) funktioniert, fühlt sich Rx etwas chaotisch an und fügt nur ein paar Boilerplates hinzu (es verursacht auch Komplikationen, wenn ich einen Nullwert zurückgeben möchte und manchmal den Stack-Trace durcheinander bringen könnte )
Ich denke darüber nach, Rx zu entfernen und Executors
stattdessen (oder Threads) für Parallelität zu verwenden. Gibt es hier Leistungsüberlegungen zu berücksichtigen?
Beispiel, woran ich denke:
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
}
Und wie folgt:
waitAll(listOf(callable1, callable2))
Oder vielleicht normale Threads verwenden und sie verbinden?
threads.forEach{
it.start()
}
threads.forEach{
it.join()
}
Oder warum nicht Streams?
listOf(callable1,callable2)
.parallelStream()
.map{it.call()}
.collect(Collectors.toList())