事件驱动与非事件驱动的Web服务器中的线程

Hec*_*rea 9 node.js

以下两个图表是我对事件驱动的Web服务器(如Node.js + JavaScript)与非事件驱动的Web服务器(如IIS + C#)相比如何工作的理解

传统(非事件驱动)Web服务器

在此输入图像描述

从图中可以很容易地看出,在传统的Web服务器上,用于执行3次长时间运行操作的线程数大于事件驱动的Web服务器上的线程数(3 vs 1)

我认为我的"传统网络服务器"计数正确(3),但我想知道事件驱动的(1).这是我的问题:

  1. 假设在事件驱动的场景中只使用了一个线程,这是正确的吗?这可能不正确,必须创建一些东西来处理I/O任务.对?

  2. 事件服务器是如何处理I/O的?假设I/O是从数据库中读取的.我怀疑Web服务器必须创建一个线程来交接连接数据库的工作?对?

  3. 如果事件驱动的Web服务器确实创建了处理I/O的线程,那么增益是多少?

  4. 我混淆的一个可能的解释可能是,在传统和事件驱动的两种情况下,确实创建了三个单独的线程来处理I/O(图中未显示),但区别在于它上的线程数量. Web服务器本身,而不是I/O线程.那是准确的吗?

ran*_*nel 5

  1. 节点可以使用线程进行IO.JS代码在单个线程中运行,但所有IO请求都在并行线程中运行.如果您希望某些JS代码在并行线程中运行,请使用thread-a-gogo或其他一些缓解该行为的软件包.

  2. 同样1.,Node为IO操作创建线程.

  3. 除非您愿意,否则不必处理线程.更容易开发.至少这是我的观点.

  4. 可以将节点应用程序编码为像另一个Web服务器一样运行.通常,JS代码在单个线程中运行,但有一些方法可以使其行为不同.

就个人而言,如果你想试验线程,我建议使用threads-a-gogo(包名不是那么透露,但很容易使用).它更快.节点还支持多个进程,如果您还想尝试,可以运行完全独立的进程.

  • 要真正理解差异,请在服务器扩展时查看线程数.对于类似apache的服务器,每个连接有1个线程,因此对于繁忙的服务器,您可能有100个甚至1000个线程.对于Node.js,线程池是固定大小的.无论服务器有多忙,线程数都将保持在10s. (4认同)