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

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

Solutions Collecting From Web of "事件驱动和基于线程的服务器系统有什么区别?"

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

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

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

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

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

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

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

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

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