为什么Vert.x称为响应,即使它是单线程的

时间:2017-08-10 10:07:56

标签: java multithreading asynchronous vert.x

我从Vert.x文档(以及其中的一些编码)中理解的是Vert.x是单线程并在事件池中执行事件 。它不会等待I / O或任何网络操作,而不是给其他事件(在任何Java多线程框架中都没有)。

但我无法理解以下事项:

  1. 单线程如何比多线程更好?如果有数百万的传入HTTP请求怎么办?不会比其他多线程框架慢吗?
  2. Verticle依赖于CPU核心。您拥有许多CPU核心,您可以并行运行许多Verticle。为什么在虚拟机上运行的语言可以根据需要使用CPU?据我所知,Java VM(JVM)是​​一个仅使用另一个操作系统进程的应用程序(这里我对OS和JVM的了解较少,因此我的问题可能很幼稚)。
  3. 如果单线程,非阻塞概念如此有效,那么为什么我们在多线程环境中不能拥有相同的非阻塞概念?不会更快吗?或者,是因为CPU一次可以执行一个线程吗?

3 个答案:

答案 0 :(得分:3)

  

我从Vert.x文档(以及其中的一些编码)中理解的是,Vert.x是单线程的,并在事件池中执行事件。

它是基于事件的,基于回调的。 It isn't single-threaded

  

每个Vertx实例都维护多个事件循环,而不是单个事件循环。默认情况下,我们根据计算机上可用核心的数量选择数字,但这可以被覆盖。

     

它不等待I / O或任何网络操作

它使用非阻塞或异步I / O,不清楚哪个。使用Reactor模式表明无阻塞,但可能不是。

  

而不是给另一个事件(在任何Java多线程框架中都没有)的时间。

这没有意义。

  
      
  1. 单线程如何比多线程更好?
  2.   

不是。

  

如果有数百万的传入HTTP请求怎么办?它不会比其他多线程框架慢吗?

  
      
  1. Verticle依赖于CPU核心。您拥有许多CPU核心,您可以并行运行许多Verticle。为什么在虚拟机上运行的语言可以根据需要使用CPU?据我所知,Java VM(JVM)是​​一个仅使用另一个操作系统进程的应用程序(这里我对OS和JVM的了解较少,因此我的问题可能很幼稚)。
  2.   

根据上面的引用,每个核心使用一个线程,或者通过覆盖它来选择任何你选择的。

  
      
  1. 如果单线程,非阻塞概念如此有效,那么为什么我们不能在多线程环境中使用相同的非阻塞概念呢?
  2.   

你可以。

  

会不会更快?

  

或者,是因为CPU一次可以执行一个线程吗?

多核CPU一次可以执行多个线程。我不知道“它是什么”,因为它指的是。

答案 1 :(得分:0)

首先,Vertx无论如何都不是单线程的。它只是不会产生它需要的更多线程。

其次,这与Vertx完全无关,JVM将线程映射到本机OS线程。

第三,我们可以在多线程环境中具有非阻塞行为。每个CPU不是一个线程,而是每个核心一个线程 但问题是:“那些线程在做什么?”。因为通常有用,他们需要其他资源。网络,数据库,文件系统,内存。在这里它变得棘手。当你是单线程时,你没有竞争条件。在任何时候唯一访问内存的是你。但是如果你是多线程的,你需要关注互斥体,或任何其他方式来保持数据的一致性。

答案 2 :(得分:0)

Q:

  

单线程比多线程好吗?如果有数百万个传入的HTTP请求怎么办?会不会比其他多线程框架慢?

A:

Vert.x不是单线程框架,它可以确保在您的应用程序中部署并向vert.x注册的“ verticle”大部分是单线程的。

这样做的原因是,与多个线程并发的并发使带有锁同步的并发和使多线程通信需要注意的其他概念的并发变得复杂。

虽然顶点是单线程的,但确实使用了一种称为事件循环的东西,这是Vert.x情况下称为反应堆模式或多反应堆模式的这种范式的真正力量。可以在一个应用程序中注册多个顶点,这些顶点之间的通信通过事件总线运行,该事件总线使顶点可以在内部使用基于事件的传输协议,但是也可以使用其他一些技术来分发这些协议来管理集群。

事件循环处理进入一个线程的事件,但是所有事件都是异步的,因此计算由循环处理,完成后,会有信号通知可以使用结果。

因此,所有计算都基于回调或使用Reactive.X / fiber /协程/通道等。​​

由于Vert.x具有更简单的并发通信模型和其他出色功能,因此实际上它比许多Blocking和纯多线程模型要快。 the numbers

Q:

  

如果单线程无阻塞概念如此有效,那么为什么在多线程环境中我们不能拥有相同的无阻塞概念?会不会更快?还是再次,是因为CPU一次可以执行一个线程吗?

A:

就像第一个问题所说的那样,它并不是真正的单线程。实际上,当您知道某件事被阻止时,您将不得不使用名为executeBlocking的方法来注册计算,这将使其在Vert.x管理的ExecutorService上运行多线程。

这里Vert.x的模型速度更快的原因也是因为事件循环更好地利用了cpu计算功能和约束。这主要由Netty项目提供动力。

具有多线程模式的多线程的锁定和同步的开销给Vert.x带来了很大的压力。