【发布时间】:2020-12-01 20:33:40
【问题描述】:
为了在这里提供一些背景信息,我已经关注项目织机一段时间了。我读过the state of loom。我做过异步编程。
异步编程(由 java nio 提供)在任务等待时将线程返回到线程池,并且竭尽全力不阻塞线程。这带来了很大的性能提升,我们现在可以处理更多请求,因为它们不受操作系统线程数量的直接约束。但是我们在这里失去的是上下文。同一个任务现在不只与一个线程相关联。一旦我们将任务与线程分离,所有的上下文都会丢失。异常跟踪没有提供非常有用的信息,调试很困难。
带有virtual threads 的项目织机将成为单一的并发单元。现在您可以在单个 virtual thread 上执行单个任务。
到目前为止一切都很好,但文章继续说明,项目织机:
一个简单的同步网络服务器将能够处理更多的请求,而不需要更多的硬件。
我不明白我们如何通过异步 API 获得项目织机的性能优势? asynchrounous APIs 确保不要让任何线程空闲。那么,project loom 做了哪些工作来使其比asynchronous API 更高效、更高效?
编辑
让我重新表述这个问题。假设我们有一个 http 服务器,它接收请求并使用支持的持久数据库执行一些 crud 操作。比如说,这个 http 服务器处理了很多请求 - 100K RPM。两种实现方式:
- HTTP 服务器有一个专用的线程池。当一个请求进来时,一个线程将任务向上传送直到它到达DB,其中任务必须等待来自DB的响应。此时,线程返回线程池并继续执行其他任务。当 DB 响应时,它会再次由线程池中的某个线程处理并返回 HTTP 响应。
- HTTP 服务器只是为每个请求生成
virtual threads。如果有 IO,虚拟线程只是等待任务完成。然后返回 HTTP 响应。基本上,virtual threads没有进行池业务。
鉴于硬件和吞吐量保持不变,任何一种解决方案在响应时间或处理更多吞吐量方面是否会比另一种解决方案更好?
我的猜测是性能不会有任何差异。
【问题讨论】:
-
The answer you got,很短,但很到位。除此之外,您已经链接到a document that explains the concept in great detail。我建议阅读它,尤其是它解释虚拟线程如何在另一个执行器的 atop 上运行的部分,例如线程池以及同步调用如何被异步对应物替换。这使得第二种方法转变为第一种方法。那么您希望从赏金中获得哪些额外信息?
标签: java multithreading asynchronous java-loom project-loom