事件驱动和基于线程的服务器系统有什么区别?

  • Node.js是一个事件驱动的I / O,它是一个单线程的服务器,对callback起作用,永远不会阻塞主线程。

    1. 但是它是如何处理非阻塞I / O的呢?
    2. 如果它确实容易pipe理,为什么不基于线程的系统pipe理呢?
    3. 不像其他线程(在单个事件驱动线程之后)像基于线程的工作?
    4. 如果其他线程表示工作者(在事件驱动线程后面)忙碌,那么它仍然可以不受阻塞地处理工作?
  • 基于线程的模型将任务分配给线程,如果没有空闲线程,则阻止新任务。

    1. 如果一个线程可以像处理每个I / O而没有阻塞的事件驱动的单线程一样处理多个任务,那么为什么基于线程的系统在忙线程中不使用这种策略来阻塞I / O。

我想知道事件驱动和基于线程的服务器系统有什么区别( 优点/缺点 )。

差异可能如下所述(有一些简化):

  • 在“线程驱动”的运行时,当一个请求进入时,一个新的线程被创build,所有的处理都在该线程中完成。

  • 在“事件驱动”的运行时,当一个请求进入时,事件被调度,处理程序将会把它捡起来。 什么时候? 在Node.js中,有一个“事件循环”,它基本上循环所有需要执行的代码片段,并逐一执行。 所以一旦事件循环调用它,处理程序将处理该事件。 这里最重要的是所有的处理程序都在同一个线程中调用 – 事件循环没有线程池可用,它只有一个线程。

在“事件驱动”模型中,如果一个处理程序需要很长时间才能完成(即通过在内部有一个计算密集的for循环),那么在此期间不会处理其他的请求,因为事件循环将不会调用下一个处理程序在当前一个完成之前。 这通常不是一个问题,因为Javascript的asynchronous性质。

另一方面,在“线程驱动”模型中,如果处理程序花费很多时间完成,则不会对其他线程造成太大的影响,因为它们可以独立同时运行。

不幸的是,创build新线程会增加一些开销,如果需要处理数千个并发连接,则可能会成为负担。 这就是为什么Node.js被认为是快速的 – 不pipe你处理了多less个连接,只有一个线程1 。 你只需要小心,不要阻止任何处理程序保持移动。 幸运的是,大多数情况下编写阻止JavaScript代码并不容易。

注意在大多数运行时间编写asynchronous代码也是很重要的。 由于Javascript的特性,它在Node.js中已经得到了最广泛的使用。 多亏了这个,几乎你在Node中使用的每个库都是asynchronous的。

看到这篇文章(和图片)的事件循环的解释。

1 Node.js过程当然还有一个线程,其中一些与I / O有关。 但是你的应用逻辑是在一个线程中处理的。