Node js如何做得更好



nodejs 的单线程异步处理模型如何以及何时比已知服务器大师(如 PHP、Java 和 C#)的多线程方法更好?有人可以简单明了地向我解释吗?

我的问题是单线程异步处理模型在技术上如何成为更好的方法?

掌握节点 JS 多线程的替代方案

Node.js 是作为异步处理中的实验显式创建的。该理论是,在单个线程上进行异步处理可以在典型的Web负载下提供比典型的基于线程的实现更高的性能和可伸缩性。单线程、异步性质确实使事情变得复杂。但是老实说,您认为它比线程更复杂吗?一个比赛条件可以毁掉你的整个月!或者由于某处的设置而清空您的线程池,并观察您的响应时间缓慢到爬行!更不用说死锁、优先级倒置以及多线程处理的所有其他回旋。

但它真的是单线程的吗?https://softwareengineeringdaily.com/2015/08/02/how-does-node-js-work-asynchronously-without-multithreading/阅读这篇文章

Node.js建立在Google的V8引擎之上,而V8引擎又编译JavaScript。正如你们中的许多人已经知道的那样,JavaScript本质上是异步的。异步是一种编程模式,它提供了非阻塞代码的功能,即不停止或不依赖另一个函数/进程来执行特定的代码行。异步在性能、资源利用率和系统吞吐量方面都很棒。但也有一些缺点: 对于传统程序员来说,使用异步非常困难。 处理控制流真的很痛苦。 回调很脏。

NodeJS是单线程的,它实际上不是一个威慑或性能障碍。单线程事件循环非常高效,比部署有效的多线程要简单得多。多线程并不总是意味着更好的性能。

话虽如此,如果您确实需要处理繁重的并发性,那么您可以使用集群模块的服务,该模块在可用的 CPU 内核之间拆分多个 NodeJS 进程,同时始终保持与可用于控制/卸载处理任务的主进程的链接。

Node 是从头开始构建的,考虑了异步性,利用了 JavaScript 的事件循环。它可以快速处理大量请求,因为在为请求完成某些类型的工作(例如数据库请求)时不等待请求。

假设您有一个需要 10 秒才能完成的数据库操作,由 setTimeout 表示

router.route('/api/delayed')  
.get(function(req, res) {
setTimeout(function() {
res.end('foo');
}, 10000);
});
router.route('/api/immediate')  
.get(function(req, res) {
res.end('bar');
});

或者不支持异步执行的后端框架,这种情况是一种反模式:服务器在等待数据库操作完成然后完成请求时将挂起。在 Node 中,它会触发操作,然后返回以准备处理下一个传入请求。操作完成后,将在即将到来的事件循环周期中处理它,并且请求得到满足。

只要我们只写非阻塞代码,我们的 Node 服务器就会比其他后端语言表现得更好

在阅读了《使用MongoDB和Node的Web开发.jsMaithun Satheesh,Jason Krol和Bruno Joseph D'mello的第2版》一书后,我终于发现了一个明显的优势。

要理解这一点,我们应该了解 Node 的问题.js 尝试解决。它尝试在单个上执行异步处理线程为应用程序提供更高的性能和可扩展性 应该处理太多的网络流量。想象网络 处理数百万个并发请求的应用程序;如果 服务器创建一个新线程来处理传入的每个请求,它 将消耗大量资源,我们最终会尝试添加 越来越多的服务器增加了应用程序的可扩展性。 单线程异步处理模型有其优势 在前面的上下文中,您可以处理更多的并发 服务器端资源数量较少的请求。

而且我注意到可以用更少的服务器端资源处理更多的并发请求

我的 2 便士价值....我不确定"NodeJS的单线程方法是否更好":简单地说,NodeJS不支持多线程。 这可以松散地翻译为"一切都在单个线程中运行"。现在,我不太确定它如何与多线程系统"比较",因为"多"线程系统可以同时支持单线程(如nodejs)和多线程。它全部在您的应用程序设计中,以及您可以使用的平台功能。

在我看来,更重要的是 以异步方式支持多任务处理的能力 .Nodejs确实在一个简化且易于使用的包中提供了对多任务处理的支持。由于缺乏对多线程的本机支持,它确实存在限制。要利用关于多线程的多任务处理(不用担心太多),请考虑将服务器端应用程序设计为在长时间的 tie 中执行小块工作,并且调用每个工作块,并使用从客户端生成的事件。 想想一个事件驱动的设计/架构(简单的开关/案例循环、回调和文件或数据库的数据检查点,就可以做到这一点)。我敢打赌我的小美元,如果你让你的应用程序以这种方式工作,没有多线程,它将是一个更好的设计,更健壮,如果你迁移它(并适应多线程),它像在SpaceX破坏者上一样运行!
虽然多线程对于服务器端实现来说是一个加分项,但它也是一个强大的野兽,需要大量的经验和尊重来驯服和驾驭(nodejs 屏蔽/保护你免受伤害的东西)

多任务处理是在应用程序级别(运行多个任务)的透视,多线程是较低级别的透视:多任务可以映射到不同的实现,多线程就是其中之一。

多线程能力

  • 真相:Node.js(目前)不提供低级执行/处理线程意义上的多线程的本机支持。Java及其实现/框架也为多线程提供了本机支持,并且也广泛(抢占,多租户,同步多线程,多任务,线程池等)

  • 裤子着火(ish):Nodejs 中缺乏多线程是一个阻碍因素。Nodejs是围绕事件驱动的架构构建的,其中事件尽可能快地产生和使用。对功能回调有本机支持。根据应用程序设计,此高级功能可以支持线程可以完成的操作。s

  • 对于服务器端应用程序,在应用程序级别,重要的是同时执行多个任务的能力:即多任务。有几种方法可以实现 多任务处理 .多线程就是其中之一,非常适合这项任务。也就是说,"多线程"的概念是一个低级平台方面。例如,多线程平台如java,托管/运行在单核进程服务器(具有1个CPU处理器核心的服务器)上仍然支持应用程序级别的多线程,映射到低级别的多线程,但实际上,只有一个线程可以在任何时间执行。在具有 sa y 4 核的多核机器上,支持在应用程序级别相同的多任务处理,并且在任何给定时间最多可以同时执行 4 个线程。关键是,在大多数情况下,真正重要的是对多任务的支持,这并不总是多线程的同义词。

  • 回到节点.js,真正的讨论应该是应用程序设计和架构,更具体地说,是对多任务的支持。通常,服务器端应用程序与客户端或独立应用程序之间存在整个范式转变,在设计和流程方面更是如此。除此之外,服务器端应用程序需要与其他应用程序一起运行(在服务器上),需要弹性和自包含(当应用程序失败或崩溃时不会影响服务器的其余部分),执行健壮的异常处理(即从错误中恢复,甚至是关键错误)并且需要执行多个任务。

  • 仅支持多任务处理的能力是任何服务器端技术的关键功能。而node.js具有这种能力,并以非常易于使用的包装呈现。这一切都意味着服务器端应用程序的设计需要更多地关注多任务处理,而不是多线程。是的,当然,在支持多线程的服务器端平台上工作有其明显的好处(增强的功能,性能),但仅凭这一点并不能解决在应用程序级别支持多任务的需求。任何针对服务器端应用程序、AND 节点.js的可靠应用程序设计都必须基于通过事件生成和使用(事件处理)的多任务处理。在node.js中,使用函数回调和小型事件处理器(作为函数),以及跨事件处理实例的数据检查点(将处理数据保存在文件或数据库中)是关键。

Node.js vs Java 还有什么

  • 还有更多!考虑可扩展性,代码管理,功能集成,向后,向前兼容性,投资回报,敏捷性,生产力...
  • ,...为了削减本文的"冗长",双关语意图:),我们将暂时将其留在这里:) 无论您同意与否,请射击信使(Quora)而不是意见!

最新更新