Java ProjectLoom:使用虚拟线程时,是什么使性能更好?

Java ProjectLoom:使用虚拟线程时,是什么使性能更好?,java,multithreading,asynchronous,java-loom,project-loom,Java,Multithreading,Asynchronous,Java Loom,Project Loom,为了在这里提供一些上下文,我已经关注ProjectLoom一段时间了。我读过。我做过异步编程 异步编程(由JavaNIO提供)在任务等待时将线程返回到线程池,并且它会竭尽全力不阻塞线程。这会带来很大的性能提升,我们现在可以处理更多的请求,因为它们不受操作系统线程数量的直接限制。但我们在这里失去的是背景。现在,同一任务不再与一个线程关联。一旦我们将任务与线程分离,所有上下文都将丢失。异常跟踪不能提供非常有用的信息,调试也很困难 在ProjectLowe中,虚拟线程成为单一的并发单元。现在,您可以在

为了在这里提供一些上下文,我已经关注ProjectLoom一段时间了。我读过。我做过异步编程

异步编程(由JavaNIO提供)在任务等待时将线程返回到线程池,并且它会竭尽全力不阻塞线程。这会带来很大的性能提升,我们现在可以处理更多的请求,因为它们不受操作系统线程数量的直接限制。但我们在这里失去的是背景。现在,同一任务不再与一个线程关联。一旦我们将任务与线程分离,所有上下文都将丢失。异常跟踪不能提供非常有用的信息,调试也很困难

在ProjectLowe中,虚拟线程成为单一的并发单元。现在,您可以在单个
虚拟线程上执行单个任务

到目前为止一切都很好,但文章接着陈述了ProjectLowe:

一个简单、同步的web服务器将能够在不需要更多硬件的情况下处理更多的请求

我不明白我们是如何通过ProjectLowest而不是异步API获得性能优势的?
异步API
确保没有任何线程处于空闲状态。那么,ProjectLowe做了什么来提高异步API的效率和性能呢

编辑 让我重新表述这个问题。假设我们有一个http服务器,它接收请求并使用支持的持久数据库执行一些crud操作。比如说,这个http服务器处理大量请求—100K RPM。实现这一点的两种方法:

  • HTTP服务器有一个专用的线程池。当一个请求进入时,一个线程会一直执行任务,直到它到达数据库,任务必须等待数据库的响应。此时,线程返回到线程池并继续执行其他任务。当DB响应时,它再次由线程池中的某个线程处理,并返回HTTP响应
  • HTTP服务器只是为每个请求生成
    虚拟线程。如果存在IO,虚拟线程将等待任务完成。然后返回HTTP响应。基本上,
    虚拟线程
    不存在池业务
  • 考虑到硬件和吞吐量保持不变,在响应时间或处理吞吐量方面,任何一种解决方案都会比另一种更好吗?


    我的猜测是,w.r.t的性能不会有任何区别。

    我们没有从异步API中获得好处。我们可能会得到类似于异步的性能,但是使用同步代码

  • http服务器有一个专用的线程池。。。。 一个多大的游泳池?(CPU数量)*N+C?N> 1随着锁争用延长了延迟,可以退回到反扩展;其中,当N=1时,可能未充分利用可用带宽。这是一个很好的分析

  • http服务器刚刚生成。。。 这将是对这一概念的一种非常幼稚的实现。更现实的方法是从动态池中收集,动态池为每个阻塞的系统调用保留一个真正的线程+为每个真正的CPU保留一个真正的线程。至少这是Go背后的人想到的

  • 关键是要防止{处理程序、回调、完成、虚拟线程、goroutine:all pea in a pod}争夺内部资源;因此,在绝对必要之前,他们不会依赖基于系统的阻塞机制。这属于锁避免的范畴,可以通过各种排队策略(参见libdispatch)等来实现。。注意,这使得PEA与底层系统线程分离,因为它们在内部进行多路复用。这是你对分离概念的担忧。在实践中,您可以传递您最喜欢的语言对上下文指针的抽象

    如前所述,有一些具体的结果可以直接与这一方法联系起来;还有一些无形资产。锁定很容易——您只需在事务周围设置一个大锁,就可以很好地进行锁定。这是不可伸缩的;但细粒度锁定很难实现。努力工作,努力选择谷物的细度。什么时候使用{locks,CVs,semaghores,barriers,…}在教科书的例子中是显而易见的;在深度嵌套的逻辑中就不那么重要了。锁避免在大多数情况下会使这种情况消失,并且仅限于像malloc()这样的争用叶组件

    我对此持怀疑态度,因为研究表明,系统的规模通常很小,它被转化为锁避免模型,然后被证明更好。我还没有看到一个能让一些有经验的开发人员分析系统的同步行为、转换系统的可伸缩性,然后测量结果的方法。但是,即使这是一场胜利,有经验的开发商也是一种罕见的昂贵商品;可扩展性的核心其实是财务方面的。

    由@talex提出的观点非常明确。更进一步

    Loom更多的是关于本机并发抽象,它还可以帮助编写异步代码。考虑到它是一个VM级抽象,而不仅仅是代码级抽象(就像我们到目前为止在
    CompletableFuture
    等方面所做的那样),它允许一个人实现异步行为,但要使用reduce

    有了织布机,一个更强大的抽象概念就是救世主。我们已经多次看到了这一点,即使用语法糖进行抽象是如何使一个人有效地编写程序的。无论是JDK8中的功能接口,还是Scala中的理解

    使用loom,无需链接多个CompletableFuture(以节省资源)。但是可以同步编写代码。当遇到每个阻塞操作(ReentrantLock、i/o、JDBC调用)时,虚拟线程就会停止。因为这些是轻量级线程,所以上下文