首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用协同网络实现非阻塞

如何利用协同网络实现非阻塞
EN

Stack Overflow用户
提问于 2019-01-04 20:34:24
回答 2查看 2.4K关注 0票数 1

我试图实现非IO阻塞协同(kotlin)的方式,将获得更多的网络呼叫比线程。显然,如何以不阻塞主线程的方式使用协同线,但最终每个协同线在一个线程内运行,网络调用阻塞该线程(比较而言,使用NodeJS允许重用工作线程,而其他请求则等待响应返回)。

我的用例是,对于每个传入的请求,我需要进行2-3个独立的外部调用,聚合响应并返回。这样做是在浪费时间。并行地这样做将需要我的服务运行大约2-3倍的传入线程数(使其仅为等待IO的线程数约为1K )。

许多couroutine示例都在使用delay,因此可以将线程并发地重用到多个过程中。然而,通过实际使用网络调用的真实的实际用例,我无法做到这一点。

我遗漏了什么?在外部服务响应之前,我如何暂停协同服务?

例如,此示例仅在5个线程上运行,但在1000个调用中重用线程,因此所有线程都在~100 is内结束(每个线程为100 is)。

代码语言:javascript
运行
复制
val myPool = Executors.newFixedThreadPool(5).asCoroutineDispatcher()
runBlocking {
  (1..1000).forEach {
    launch(myPool) {
      delay(100)
    }
  }
}

与此相反,它实际上只在5个线程上运行5个并发调用,并且只在完成一次之后继续到下一个线程。我希望“并行”执行所有调用,在等待响应时利用发送请求的优势--就像在NodeJS中那样

代码语言:javascript
运行
复制
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
    }
  }
}
EN

回答 2

Stack Overflow用户

发布于 2019-01-07 08:42:20

Kotlin协同作用不是将阻塞网络操作转化为非阻塞操作的魔法。它们只允许您使用异步网络实现,而不需要经过后续操作和回调。

所以,为了继续,

  • 步骤1.查找异步REST库
  • 步骤2.编写一些Kotlin代码,将库的本机回调或基于未来的API连接到Kotlin协同服务。
票数 3
EN

Stack Overflow用户

发布于 2021-05-24 10:37:37

“我希望所有调用”并行“执行!

你为什么不删除Executors.newFixedThreadPool(5),并给出由他自己运行的协同机制的Dispatchers.IO?

代码语言:javascript
运行
复制
runBlocking {
  (1..1000).forEach {
    launch(Dispatchers.IO) {
      delay(100)
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54045662

复制
相关文章

相似问题

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