要并行处理集合中的项目,您可以使用Kotlin Coroutines。例如,以下扩展函数并行处理项目并等待它们被处理:
suspend fun <T, R> Iterable<T>.processInParallel(
dispatcher: CoroutineDispatcher = Dispatchers.IO,
processBlock: suspend (v: T) -> R,
): List<R> = coroutineScope { // or supervisorScope
map {
async(dispatcher) { processBlock(it) }
}.awaitAll()
}
这是类型的suspend
扩展函数Iterable<T>
,它对项目进行并行处理并返回处理每个项目的一些结果。默认情况下,它使用Dispatchers.IO
调度程序将阻塞任务卸载到共享线程池。必须从协程(包括带有Dispatchers.Main
调度程序的协程)或其他suspend
函数中调用。
从协程调用的示例:
val myObjects: List<MyObject> = getMyObjects()
someCoroutineScope.launch {
val results = myObjects.processInParallel {
someMethod(it)
}
// use processing results
}
someCoroutineScope
的实例在哪里CoroutineScope
。
或者,如果您只想启动并忘记,您可以使用此功能:
fun <T> CoroutineScope.processInParallelAndForget(
iterable: Iterable<T>,
dispatcher: CoroutineDispatcher = Dispatchers.IO,
processBlock: suspend (v: T) -> Unit
) = iterable.forEach {
launch(dispatcher) { processBlock(it) }
}
这是 上的扩展函数CoroutineScope
,不返回任何结果。它还Dispatchers.IO
默认使用调度程序。可以使用CoroutineScope
或从另一个协程调用。调用示例:
someoroutineScope.processInParallelAndForget(myObjects) {
someMethod(it)
}
// OR from another coroutine:
someCoroutineScope.launch {
processInParallelAndForget(myObjects) {
someMethod(it)
}
}
someCoroutineScope
的实例在哪里CoroutineScope
。