在事件驱动与非事件驱动的Web服务器中进行线程
下面的两个图表是我对事件驱动的Web服务器(比如Node.js + JavaScript)与非事件驱动的Web服务器(比如IIS + C#)相比如何工作的理解。
从图中很容易看出,在传统的Web服务器上,用于执行3个长时间运行的操作的线程数大于事件驱动的Web服务器(3个vs 1个)。
我认为我得到了“传统的Web服务器”计数正确(3),但我想知道事件驱动的(1)。 这是我的问题:
-
假设事件驱动场景中只使用一个线程是否正确? 这不可能是正确的,必须创build一些处理I / O任务。 对?
-
服务器是如何处理I / O的? 假设I / O是从数据库中读取的。 我怀疑Web服务器不得不创build一个线程来切断连接到数据库的工作? 对?
-
如果事件驱动的Web服务器确实创build了线程来处理I / O的收益在哪里?
-
对我的困惑可能的解释可能是,在这两种情况下,传统的和事件驱动的, 确实创build了三个独立的线程来处理I / O (图中未显示),但差异实际上是线程数Web服务器,而不是I / O线程。 这是准确的吗?
-
节点可能使用线程进行IO。 JS代码在单个线程中运行,但是所有IO请求都在并行线程中运行。 如果你想要一些JS代码在并行线程中运行,可以使用thread-a-gogo或其他一些包来缓解这种行为。
-
与
1.
相同,线程由节点为IO操作创build。 -
除非你想,否则你不必处理线程。 更容易开发。 至less这是我的观点。
-
节点应用程序可以编码为像另一个Web服务器一样运行。 通常情况下,JS代码运行在一个单一的线程,但有办法使其行为有所不同。
就个人而言,如果您想要尝试使用线程,我build议使用threads-a-gogo(包名称不能透露,但易于使用)。 速度更快 Node还支持多个进程,如果你也想尝试一下,你可以运行一个完全独立的进程。
描绘NodeJS的最好方法就像是一个愤怒的松鼠(也就是你的线程),它运行在一个有无限数量的鸽子(你的I / O)的轮子上,可以传递消息。
节点中的I / O是“空闲”的。 你的松鼠build立连接并把鸽子关掉,然后在鸽子检索数据时可以继续做其他事情,只有鸽子返回时才处理数据。
如果你编写错误的代码,你可能会得到松鼠等待每只鸽子。
所以总是写非阻塞的I / O代码。
如果你能鼓励你的鸽子答应回来;)
承诺和发电机可能是你可以采取的最好的方法。
但是你总是可以使用节点集群来build立一个主松鼠,根据主松鼠可以find的CPU的数量来生产松鼠。
希望这有助于并注意到完全缺乏汽车的比喻。
- 我应该在哪里存储我的数据模型?
- Browserify转换+ sourcemaps之间的区别当通过CLI运行时编程方式在Gulpfile?
- 创build一个文档并添加到相同的路线设置
- OUTLOOK REST API使用Node.js接受事件
- 在testingmocha中的nodeJS时,域不能正确捕获错误
- asynchronous初始化express.js(或类似的)应用程序
- 尝试了解更多关于Javascript -Node.jsasynchronous调用堆栈
- 使用选定的下拉选项作为在node.js Kmeans函数中使用的variables
- 单线程事件驱动的web服务器(如node.js)如何在套接字级别上工作?