如何以及何时,nodejs的单线程异步处理模型比PHP,Java和C#等已知服务器大师的多线程方法更好。有人可以简单明了地向我解释一下吗?
我的问题是技术上如何将单线程异步处理模型作为更好的方法?
答案 0 :(得分:2)
Grasping the Node JS alternative to multithreading
Node.js是作为异步处理的实验明确创建的。理论上,在典型的Web负载下,在单个线程上执行异步处理可以提供比典型的基于线程的实现更高的性能和可伸缩性。 单线程,异步性质确实使事情变得复杂。但你真的认为它比线程更复杂吗?一场比赛的情况可能毁了整个月!或者由于某些设置而将您的线程池清空,并观察您的响应时间慢到爬行!更不用说死锁,优先级反转以及多线程所带来的所有其他旋转。
但它真的是单线程的。阅读这篇文章https://softwareengineeringdaily.com/2015/08/02/how-does-node-js-work-asynchronously-without-multithreading/
答案 1 :(得分:0)
Node.js建立在谷歌的V8引擎之上,后者反过来编译JavaScript。正如你们许多人所知,JavaScript本质上是异步的。异步是一种编程模式,它提供非阻塞代码的特性,即不停止或不依赖于另一个函数/进程来执行特定的代码行。异步在性能,资源利用率和系统吞吐量方面都很好。但是有一些缺点: 传统程序员很难继续使用Async。 处理控制流程真的很痛苦。 回调很脏。
NodeJS是单线程的,它实际上不是威慑或性能块。单线程事件循环非常高效,并且比部署有效的多线程要简单得多。多线程并不总是意味着更好的性能。
话虽如此,如果您确实需要处理繁重的并发,那么您可以使用群集模块的服务,该服务在可用的CPU核心之间拆分多个NodeJS进程,同时保持与可以使用的主进程的链接控制/卸载处理任务。
答案 2 :(得分:0)
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服务器将比其他后端语言表现更好
答案 3 :(得分:0)
在书中读到:使用MongoDB和Node.js进行Web开发第2版,由Maithun Satheesh,Jason Krol和Bruno Joseph D'mello,我终于找到了明显的优势
要理解这一点,我们应该了解Node.js的问题 试图解决。它试图在单个上进行异步处理 线程为应用程序提供更多性能和可伸缩性 应该处理太多的网络流量。想象一下网络 处理数百万个并发请求的应用程序;如果 服务器创建一个新线程来处理进来的每个请求,它 将消耗大量资源,我们最终会尝试添加 越来越多的服务器增加了应用程序的可伸缩性。 单线程异步处理模型有其优点 在上一个上下文中,您可以处理更多并发 使用较少数量的服务器端资源的请求。
我注意到可以使用较少的服务器端资源处理更多的并发请求
答案 4 :(得分:0)
我的2便士价值....我不确定"如果nodejs的单线程方法更好" :简单地说,nodejs不支持多线程。可以松散地转换为"一切都在一个线程中运行"。现在,我不太确定它是如何做的"比较"一个多线程系统,作为一个多线程系统。线程系统既可以支持单个线程(如nodejs),也可以支持多个线程。它完全在您的应用程序设计中,以及您可以使用的平台功能。
在我看来,更重要的是能够以异步方式支持多任务.Nodejs确实在简化且易于使用的包中提供对多任务的支持。由于缺乏对多线程的本机支持,它确实存在局限性。利用多线程的多任务(而不是太担心),考虑设计服务器端应用程序,在长时间的连接中执行少量工作,并调用每个工作块,并消费从客户端生成的事件。想一个事件驱动的设计/架构(简单的开关/案例用于循环,回调,以及对文件或数据库的数据检查点,可以做到这一点)。我敢打赌,如果你让你的应用程序以这种方式工作,没有多线程,它将是一个更好的设计,更强大,如果你迁移它(并适应多线程)它在SpaceX的破坏者身上跑! 虽然多线程对于服务器端实现来说是一个优势,但它也是一个强大的野兽,需要大量的经验和对驯服和利用的尊重(nodejs屏蔽/保护你的东西)
另一种观察方式是:多任务是在应用程序级别(运行多个任务)的透视图,多线程是一个透视图,处于较低级别:多任务处理可以映射到不同的实现,多线程就是其中之一。
多线程功能
真相:Node.js(当前)在低级别执行/处理线程意义上不提供对多线程的本机支持。 Java及其实现/框架为多线程提供原生支持,并且也广泛支持(抢占,多租户,同步多线程,多任务,线程池等)
Pants on Fire(ish):在Nodejs中缺少多线程是一个显示停止。 Nodejs围绕事件驱动的体系结构构建,尽可能快地生成和使用事件。本机支持功能回调。根据应用程序设计,这种高级功能可以支持线程可以完成的任务。小号
对于服务器端应用程序,在应用程序级别,重要的是能够同时执行多个任务:即多任务。有多种方法可以实现多任务处理。多线程是其中之一,并且非常适合任务。也就是说,“多线程”的概念是一个低级平台方面。例如,在单核心流程服务器(具有1个CPU处理器核心的服务器)上托管/运行的多线程平台(例如java)仍支持应用程序级别的多重复用,映射到低级别的多线程,但实际上,只有一个线程可以在任何准时执行。在具有4个内核的多核机器上,支持应用程序级别的相同多任务,并且在任何给定时间最多可同时执行4个线程。关键是,在大多数情况下,真正重要的是对多任务的支持,这并不总是多线程的同义词。
回到node.js,真正的讨论应该是应用程序设计和架构,更具体地说,是对MULTI-TASKING的支持。通常,服务器端应用程序与客户端应用程序或独立应用程序之间存在整体范式转换,在设计和流程方面更是如此。除此之外,服务器端应用程序需要与其他应用程序(在服务器上)一起运行,需要具有弹性和自包含(在应用程序失败或崩溃时不影响服务器的其余部分),执行强大的异常处理(即从错误,甚至是关键错误)并且需要执行多项任务。
Node.js还有Java还有什么