【发布时间】:2019-06-21 09:44:05
【问题描述】:
我有一个大数组,需要在该数组的每个元素上执行繁重的 CPU 工作。
基于my similar question,Alexei Kaigorodov 先生建议最好的方法是在每个单独的线程上拆分计算每个数据块。
还有我使用Kotlin协程实现算法的实现:
suspend fun predictAll(movingVehicles: List<MovingVehicle>): List<MovingVehicle?> {
val prevTime = Timestamp(Date().time)
val nextTime = Timestamp(Date().time)
val ctx = Dispatchers.Default
val processors = Runtime.getRuntime().availableProcessors()
val chunks = movingVehicles.chunked(movingVehicles.count() / processors)
val s = coroutineScope {
val res = mutableListOf<Deferred<List<MovingVehicle?>>>()
for (c in chunks) {
val r = async(ctx) {
c.map { predictLocation(it, prevTime, nextTime) }
}
res.add(r)
}
res.awaitAll()
}
return s.flatten()
}
private fun predictLocation(
mv: MovingVehicle,
prevTime: Timestamp,
nextTime: Timestamp,
relevance: Int = 5
): MovingVehicle?
它有效,但也许有更好的方法? 我正在寻找 ExecutorService,但看起来它需要比协程更多的样板代码。
【问题讨论】:
-
我投票结束这个问题作为离题,因为这个社区不是为了审查工作代码(也许,只是也许:codereview.stackexchange.com 会是你请求的更好的地方)
标签: java multithreading kotlin kotlin-coroutines