Tôi đang viết một ứng dụng phụ trợ trong Kotlin.
Để tăng tốc mọi thứ, tôi hiện đang dựa vào RxKotlin trên máy chủ để thực hiện song song các tác vụ IO như cuộc gọi cơ sở dữ liệu & lệnh gọi API. Mã thường trông như thế này.
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()
Tuy nhiên, vì không hoạt động thực sự hoạt động với nhiều sự kiện (chỉ là đơn), Rx cảm thấy hơi lộn xộn và chỉ thêm một bó nồi hơi (nó cũng gây ra sự phức tạp nếu tôi muốn trả về giá trị null và đôi khi có thể làm hỏng dấu vết ngăn xếp )
Tôi đang nghĩ đến việc loại bỏ Rx và sử dụng Executors
(hoặc chủ đề) cho song song thay thế. Có bất kỳ cân nhắc hiệu suất để xem xét ở đây?
Ví dụ những gì tôi nghĩ về:
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
}
Và sử dụng nó như vậy:
waitAll(listOf(callable1, callable2))
Hoặc có thể sử dụng chủ đề thường xuyên và tham gia chúng?
threads.forEach{
it.start()
}
threads.forEach{
it.join()
}
Hay tại sao không stream?
listOf(callable1,callable2)
.parallelStream()
.map{it.call()}
.collect(Collectors.toList())