Node.js 的单线程事件驱动模型和内置的线程池模型

简介: 原文:Why Node.js is a single threaded language ?

构建在 node.js 之上的应用程序使用单线程事件循环模型架构来处理多个并发客户端,如 JSP、Spring MVC、ASP.NET、HTML、Ajax、jQuery 等。存在其他可以使用的 web 技术,但这些列出的技术遵循“多线程请求-响应”架构来处理多个并发客户端。


单线程:Node JS 平台不遵循多线程请求/响应无状态模型。 它遵循单线程与事件循环模型。 Node JS Processing 模型主要受 JavaScript 基于事件的模型的启发,具有 JavaScript 回调机制。 因此,Node.js 可以轻松处理更多并发客户端请求。事件循环是 Node.js 处理模型的核心,如下图所示。

image.png

n = 客户端对 Node.js Web 服务器的请求数。

假设他们同时访问我们构建在 Node.js 之上的 Web 应用程序客户端是 Client-1, Client-2 。 . . 客户端-n。

m = 线程池中的线程数。


Web 服务器接收 Client-1, Client-2 。 . . 直到 Client-n 请求并将它们放入事件队列中。


单线程事件循环相对于多线程请求/响应无状态模型的优势:


可以轻松处理越来越多的并发客户端请求。

由于事件循环,无需创建越来越多的线程。

构建在 node.js 之上的应用程序使用尽可能少的线程来减少内存或资源使用。


node.js 使用单线程事件循环模型架构的原因:


最初,node.js 是作为异步处理的实验而创建的,理论上,在应用程序不使用 CPU 时,在单个线程上进行异步处理可以在典型的 Web 负载下提供比典型的基于线程的实现更高的性能和可扩展性密集的东西,并且可以运行比 Apache 或 IIS 或其他基于线程的服务器多数千个并发连接。


node.js 的单线程、异步特性也确实使事情变得复杂,但在设计应用程序所花费的时间、开发成本、死锁、优先级倒置以及所有应用程序的生命周期问题方面,线程比这更糟糕。


对于服务器的每个请求用一个线程来响应的模型还有一个众所周知且备受批评的问题,即与事件循环线程模型相比,它们在多种场景下的扩展性不佳,简而言之,它们缺乏作为应用程序的可扩展性不断增长以满足未来的需求并增加新功能。


由于 Node.js 遵循单线程事件循环模型,其灵感来自 JavaScript 基于事件的模型和 JavaScript 回调机制。因此,node.js 是类似于 JavaScript 的单线程,但不是纯 JavaScript 代码,这意味着像网络调用、文件系统任务、DNS 查找等异步完成的事情实际上并不由主线程处理。


How the single threaded non blocking IO model works in NodeJS ?

示例:如果我们收到来自两个用户 A 和 B 的请求。通过非阻塞 IO,我们可以发起对 A 的请求,然后立即对 B 发起请求,而无需等待对 A 请求的响应。因此我们可以说借助 non -blocking IO 我们可以消除多线程的使用,因为节点服务器可以同时处理多个请求。


Working of single-threaded non-blocking IO:

image.png

相关文章
|
1月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
1月前
|
Java
线程池中的空余线程是如何被回收的
线程池中的空余线程是如何被回收的
30 1
|
2月前
|
Java
网络 I/O:单 Selector 多线程(单线程模型)
网络 I/O:单 Selector 多线程(单线程模型)
|
1月前
|
人工智能 JSON 前端开发
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
|
28天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
72 0
|
23天前
|
JavaScript 前端开发
JS 单线程还是多线程,如何显示异步操作
JS 单线程还是多线程,如何显示异步操作
22 2
|
25天前
|
Java 测试技术 Python
Python开启线程和线程池的方法
Python开启线程和线程池的方法
17 0
Python开启线程和线程池的方法
|
28天前
|
安全 Java 调度
【C/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要介绍
【C/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要介绍
43 2
|
1月前
|
负载均衡 Java 数据处理
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(三)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
52 2
|
1月前
|
存储 监控 Java
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(二)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
42 1