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

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

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

在这里输入图像描述

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

我认为我得到了“传统的Web服务器”计数正确(3),但我想知道事件驱动的(1)。 这是我的问题:

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

  2. 服务器是如何处理I / O的? 假设I / O是从数据库中读取的。 我怀疑Web服务器不得不创build一个线程来切断连接到数据库的工作? 对?

  3. 如果事件驱动的Web服务器确实创build了线程来处理I / O的收益在哪里?

  4. 对我的困惑可能的解释可能是,在这两种情况下,传统的和事件驱动的, 确实创build了三个独立的线程来处理I / O (图中未显示),但差异实际上是线程数Web服务器,而不是I / O线程。 这是准确的吗?

  1. 节点可能使用线程进行IO。 JS代码在单个线程中运行,但是所有IO请求都在并行线程中运行。 如果你想要一些JS代码在并行线程中运行,可以使用thread-a-gogo或其他一些包来缓解这种行为。

  2. 1.相同,线程由节点为IO操作创build。

  3. 除非你想,否则你不必处理线程。 更容易开发。 至less这是我的观点。

  4. 节点应用程序可以编码为像另一个Web服务器一样运行。 通常情况下,JS代码运行在一个单一的线程,但有办法使其行为有所不同。

就个人而言,如果您想要尝试使用线程,我build议使用threads-a-gogo(包名称不能透露,但易于使用)。 速度更快 Node还支持多个进程,如果你也想尝试一下,你可以运行一个完全独立的进程。

描绘NodeJS的最好方法就像是一个愤怒的松鼠(也就是你的线程),它运行在一个有无限数量的鸽子(你的I / O)的轮子上,可以传递消息。

节点中的I / O是“空闲”的。 你的松鼠build立连接并把鸽子关掉,然后在鸽子检索数据时可以继续做其他事情,只有鸽子返回时才处理数据。

如果你编写错误的代码,你可能会得到松鼠等待每只鸽子。

所以总是写非阻塞的I / O代码。

如果你能鼓励你的鸽子答应回来;)

承诺和发电机可能是你可以采取的最好的方法。

但是你总是可以使用节点集群来build立一个主松鼠,根据主松鼠可以find的CPU的数量来生产松鼠。

希望这有助于并注意到完全缺乏汽车的比喻。