我正在用kotlin测试一种行为,其中我想要使api调用对应于一个列表。我正在使用异步等待进行异步调用。下面是一段代码来模仿这一点:
/**
* You can edit, run, and share this code.
* play.kotlinlang.org
*/
import kotlinx.coroutines.*
fun main() {
val numList = (1..20).toList()
//print(numList)
runBlocking(Dispatchers.IO.limitedParallelism(5)){
numList.map{
async{delayed(it)}
}.awaitAll()
}
}
suspend fun delayed(number: Int):Int {
print("$number Start")
delay(1000)
println("$number end")
return number
}我正在试用1.6.0+版本
这个打印的输出从1-20开始,最后是1-20,我想在这里控制并行性,我不想一次用所有的请求轰炸服务器。我要有控制的异步性。
由于我有有限的并行性,我希望得到一个响应,比如1-5开始,1-5结束,5-10开始,5-10结束.15-20开始,15-20结束
然而,它仍然是从1-20结束的1-20开始。有限的并行性似乎控制了它将使用的线程数。你知道我怎样才能继续在这里实现控制吗?
发布于 2022-03-30 10:22:47
您在这里限制了paralellism,但是您需要限制并发性。这两个词是相关的,但它们的含义不同。这里解释了不同之处:并发性和并行性有什么区别?
要限制并发性,需要使用同步实用程序,在这种情况下最简单的方法是使用信号量。
val semaphore = Semaphore(5)
numList.map{
async {
semaphore.withPermit {
delayed(it)
}
}
}.awaitAll()您可以删除limitedParallelism(5),不需要它。
或者,我们可以创建一个任务队列(频道),并启动将使用它的项目的5协同。它提供了对进程的更多控制,如果我们计划排队处理大量任务(比如数万个任务),那么保持一个任务队列可能比启动数千个协同任务更好。但是在您的例子中,信号量似乎是一种更好的方法,因为它更简单。
https://stackoverflow.com/questions/71675069
复制相似问题