我试图实现非IO阻塞协同(kotlin)的方式,将获得更多的网络呼叫比线程。显然,如何以不阻塞主线程的方式使用协同线,但最终每个协同线在一个线程内运行,网络调用阻塞该线程(比较而言,使用NodeJS允许重用工作线程,而其他请求则等待响应返回)。
我的用例是,对于每个传入的请求,我需要进行2-3个独立的外部调用,聚合响应并返回。这样做是在浪费时间。并行地这样做将需要我的服务运行大约2-3倍的传入线程数(使其仅为等待IO的线程数约为1K )。
许多couroutine示例都在使用delay
,因此可以将线程并发地重用到多个过程中。然而,通过实际使用网络调用的真实的实际用例,我无法做到这一点。
我遗漏了什么?在外部服务响应之前,我如何暂停协同服务?
例如,此示例仅在5个线程上运行,但在1000个调用中重用线程,因此所有线程都在~100 is内结束(每个线程为100 is)。
val myPool = Executors.newFixedThreadPool(5).asCoroutineDispatcher()
runBlocking {
(1..1000).forEach {
launch(myPool) {
delay(100)
}
}
}
与此相反,它实际上只在5个线程上运行5个并发调用,并且只在完成一次之后继续到下一个线程。我希望“并行”执行所有调用,在等待响应时利用发送请求的优势--就像在NodeJS中那样
val restTemplate = RestTemplate()
val myPool = Executors.newFixedThreadPool(5).asCoroutineDispatcher()
runBlocking {
(1..1000).forEach {
launch(myPool) {
restTemplate.getForObject("http://myTest.com", String::class.java) // Say it takes 100ms to response
}
}
}
发布于 2019-01-07 08:42:20
Kotlin协同作用不是将阻塞网络操作转化为非阻塞操作的魔法。它们只允许您使用异步网络实现,而不需要经过后续操作和回调。
所以,为了继续,
发布于 2021-05-24 10:37:37
“我希望所有调用”并行“执行!
你为什么不删除Executors.newFixedThreadPool(5),并给出由他自己运行的协同机制的Dispatchers.IO?
runBlocking {
(1..1000).forEach {
launch(Dispatchers.IO) {
delay(100)
}
}
}
https://stackoverflow.com/questions/54045662
复制相似问题