猿问

为什么Node.js是单线程的?

在基于PHP(或Java / ASP.NET / Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。但是在Node.js中,所有客户端都在同一线程上运行(它们甚至可以共享相同的变量!)我知道I / O操作是基于事件的,因此它们不会阻塞主线程循环。

我不明白为什么Node的作者选择了它为单线程?这使事情变得困难。例如,我无法运行CPU密集型功能,因为它会阻塞主线程(并且会阻止新的客户端请求),因此我需要产生一个进程(这意味着我需要创建一个单独的JavaScript文件并在其上执行另一个节点进程) )。但是,在PHP cpu中,密集型任务不会阻止其他客户端,因为正如我提到的那样,每个客户端都在不同的线程上。与多线程Web服务器相比,它有什么优势?

注意:我已经使用集群解决了这个问题,但这并不是很漂亮。


慕哥6287543
浏览 938回答 3
3回答

森林海

Node.js是作为异步处理中的实验而显式创建的。从理论上讲,与典型的基于线程的实现相比,在典型的Web负载下对单个线程执行异步处理可以提供更高的性能和可伸缩性。你知道吗?我认为理论已经被证实。与Apache或IIS或其他基于线程的服务器相比,不占用大量CPU资源的node.js应用程序可以运行数千个并发连接。单线程异步性质的确使事情变得复杂。但是,老实说,您认为它比线程处理还要复杂吗?一种种族状况可能会破坏您的整个月!或由于某处的某些设置而清空线程池,并观察响应时间变慢以进行爬网!更不用说死锁,优先级反转以及与多线程相关的所有其他回旋。最后,我不认为它普遍好坏。这是不同的,有时更好,有时则不是。使用正确的工具完成工作。

料青山看我应如是

服务器的“每个请求一个线程”模型的问题在于,与事件循环线程模型相比,它们在几种情况下无法很好地扩展。通常,在I / O密集型方案中,请求花费大部分时间等待I / O完成。在此期间,在“每个请求一个线程”模型中,链接到该线程的资源(例如内存)未使用,内存是限制因素。在事件循环模型中,循环线程选择要处理的下一个事件(I / O完成)。因此,线程总是很忙(如果正确编程的话)。事件循环模型看起来很新鲜,所有问题的解决方案都取决于您需要解决的情况,但是要使用哪种模型。如果您具有密集型I / O方案(如代理),则将以事件基模型为准,而并行进程数量较少的CPU密集型方案将最适合基于线程的模型。在现实世界中,大多数情况都将处于中间位置。您将需要在可伸缩性的实际需求与开发复杂性之间找到平衡,以找到正确的体系结构(例如,具有事件基前端,该事件基前端可以委托后端执行CPU密集型任务。前端将使用很少的资源来等待任务与任何分布式系统一样,它需要付出一些努力才能使其正常工作。如果您不费吹灰之力地寻找适合任何情况的银色子弹,那么最终您将获得一枚子弹。
随时随地看视频慕课网APP

相关分类

Node.js
我要回答