首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以有限的并行性等待Kotlin异步

以有限的并行性等待Kotlin异步
EN

Stack Overflow用户
提问于 2022-03-30 09:52:17
回答 1查看 482关注 0票数 1

我正在用kotlin测试一种行为,其中我想要使api调用对应于一个列表。我正在使用异步等待进行异步调用。下面是一段代码来模仿这一点:

代码语言:javascript
复制
/**
 * 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开始。有限的并行性似乎控制了它将使用的线程数。你知道我怎样才能继续在这里实现控制吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-30 10:22:47

您在这里限制了paralellism,但是您需要限制并发性。这两个词是相关的,但它们的含义不同。这里解释了不同之处:并发性和并行性有什么区别?

要限制并发性,需要使用同步实用程序,在这种情况下最简单的方法是使用信号量

代码语言:javascript
复制
val semaphore = Semaphore(5)
numList.map{
    async {
        semaphore.withPermit {
            delayed(it)
        }
    }
}.awaitAll()

您可以删除limitedParallelism(5),不需要它。

或者,我们可以创建一个任务队列(频道),并启动将使用它的项目的5协同。它提供了对进程的更多控制,如果我们计划排队处理大量任务(比如数万个任务),那么保持一个任务队列可能比启动数千个协同任务更好。但是在您的例子中,信号量似乎是一种更好的方法,因为它更简单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71675069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档