Kotlinでバックエンドアプリケーションを作成しています。
速度を上げるために、私は現在、サーバーのRxKotlinを使用して、データベース呼び出しやAPI呼び出しなどのIOタスクの並列実行を行っています。コードは通常、次のようになります。
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()
ただし、実際には複数のイベント(単一のイベント)では機能しないため、Rxは少し乱雑な感じになり、ボイラープレートの束を追加するだけです(null値を返したい場合や、スタックトレースをめちゃくちゃにする可能性がある場合にも複雑になります) )
Executors
代わりに、Rxを削除して並列処理に使用(またはスレッド)することを考えています。ここで考慮すべきパフォーマンスの考慮事項はありますか?
私が考えている例:
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
}
そしてそれを次のように使用します:
waitAll(listOf(callable1, callable2))
または、通常のスレッドを使用してそれらに参加しますか?
threads.forEach{
it.start()
}
threads.forEach{
it.join()
}
または、なぜストリーミングしないのですか?
listOf(callable1,callable2)
.parallelStream()
.map{it.call()}
.collect(Collectors.toList())