项目织机:使用虚拟线程时,什么使性能更好?
为了在这里提供一些背景,我已经关注Project Loom一段时间了。我读过《织布机的状态》。我做过异步编程。
异步编程(由 Java NIO 提供)在任务等待时将线程返回到线程池,并且它竭尽全力不阻塞线程。这带来了很大的性能提升,我们现在可以处理更多的请求,因为它们不受操作系统线程数量的直接约束。但我们在这里失去的是背景。同一任务现在不仅与一个线程关联。一旦我们将任务与线程分离,所有上下文都将丢失。异常跟踪不能提供非常有用的信息,调试也很困难。
在 Project Loom 中,虚拟线程成为并发的单一单元。现在,您可以在单个虚拟线程上执行单个任务。
到目前为止,一切都很好,但文章继续说,在Project Loom:
一个简单的同步Web服务器将能够处理更多的请求,而无需更多的硬件。
我不明白我们如何通过 Project Loom 而不是异步 API 获得性能优势?异步 API:s 确保不让任何线程处于空闲状态。那么,Project Loom 做了什么来使其比异步 API:s 更高效、更高性能呢?
编辑
让我重新表述这个问题。假设我们有一个http服务器,它接受请求,并使用支持持久性数据库执行一些粗略操作。比方说,这个http服务器处理了很多请求 - 100K RPM。实现此目的的两种方法:
- HTTP 服务器具有专用的线程池。当请求传入时,线程将任务向上传递,直到它到达数据库,其中任务必须等待来自DB的响应。此时,线程返回到线程池并继续执行其他任务。当 DB 响应时,它将再次由线程池中的某个线程处理,并返回 HTTP 响应。
- HTTP服务器只是为每个请求生成虚拟线程。如果存在 IO,则虚拟线程仅等待任务完成。然后返回 HTTP 响应。基本上,虚拟线程没有池化业务。
假设硬件和吞吐量保持不变,任何一种解决方案在响应时间或处理更多吞吐量方面都会比另一种解决方案更好吗?
我的猜测是,w.r.t性能不会有任何区别。