关于node.js:Nodejs-的单线程事件驱动模型和内置的线程池模型

7次阅读

共计 1497 个字符,预计需要花费 4 分钟才能阅读完成。

原文: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 解决模型的外围,如下图所示。

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:

当客户端向服务器发送申请时,该申请称为事件。这些所有申请都存储在一个事件队列中。事件循环中存在的单个线程将此申请调配给外部线程池中存在的线程之一。

该线程读取客户端申请,解决申请,在须要时执行任何阻塞 IO 操作,并筹备将最终响应发送回服务器。事件循环将此响应发送回相应的客户端。

事件循环有限地接管申请并解决它们。

因为事件循环,不须要多个线程。因为这个事件循环和单线程的概念,node.js 应用更少的资源和内存。

更多 Jerry 的原创文章,尽在:” 汪子熙 ”:

正文完
 0