Node.js nodejs是单线程的这一事实到底意味着什么?

Node.js nodejs是单线程的这一事实到底意味着什么?,node.js,Node.js,NodeJS网站上说了以下内容。重点是我的 Node.js是一个基于Chrome的JavaScript运行时构建的平台,用于轻松构建快速、可扩展的网络应用程序。Node.js使用事件驱动、非阻塞I/O模型,使其轻量级、高效,非常适合跨分布式设备运行的数据密集型实时应用程序 尽管我喜欢NodeJS,但我不明白为什么它比现有的技术(如Python、Java甚至PHP)更适合于可伸缩的应用程序 据我所知,JavaScript运行时总是作为CPU中的单个线程运行。然而,IO可能使用底层内核方法,这些方法

NodeJS网站上说了以下内容。重点是我的

Node.js是一个基于Chrome的JavaScript运行时构建的平台,用于轻松构建快速、可扩展的网络应用程序。Node.js使用事件驱动、非阻塞I/O模型,使其轻量级、高效,非常适合跨分布式设备运行的数据密集型实时应用程序

尽管我喜欢NodeJS,但我不明白为什么它比现有的技术(如Python、Java甚至PHP)更适合于可伸缩的应用程序

据我所知,JavaScript运行时总是作为CPU中的单个线程运行。然而,IO可能使用底层内核方法,这些方法可能依赖于内核提供的线程池

因此,真正需要回答的问题是:

  • 因为所有JS代码都将在一个线程中运行,所以NodeJS不适合IO较少且计算量较大的应用程序
  • 如果我使用nodejs编写一个web应用程序,并且有100个打开的连接,每个连接执行一个纯计算需要100毫秒,那么其中至少有一个需要10秒才能完成
  • 如果您的机器有10个内核,但您只运行一个nodeJS实例,那么您的其他9个cpu就成了坐以待毙的对象了
    如果您还发布其他技术在这些情况下如何执行viz a viz NODEJ,我将不胜感激。

    我没有做过很多节点,但我对此有一些看法。如果我错了,请改正,所以

    因为所有JS代码都将在一个线程中运行,所以NodeJS不适合IO较少且计算量较大的应用程序

    嗯。单线程意味着,如果您在JS代码中硬处理大量数据,那么您将阻塞其他所有内容。这太糟糕了。但这并不是大多数web应用程序的典型情况

    如果我使用nodejs编写一个web应用程序,并且有100个打开的连接,每个连接执行一个纯计算需要100毫秒,那么其中至少有一个需要10秒才能完成

    是的。10秒的CPU时间

    如果您的机器有10个内核,但您只运行一个nodeJS实例,那么您的其他9个cpu就成了坐以待毙的对象了

    我不确定。V8引擎可能有一些优化,利用了多核,对程序员来说是透明的。但我对此表示怀疑


    问题是,大多数时候web应用程序都没有计算。如果你的应用程序设计得很好,一个请求就可以很快得到响应。如果您必须获取数据(数据库、文件、远程服务),则不必在处理下一个请求之前等待获取返回

    因此,由于I/O回调发生的时间,您可能在不同的完成阶段的不同阶段同时有许多请求。即使一次只有一个请求在运行JS代码,该代码也应该很快完成它需要做的事情,退出运行循环,并等待下一个事件回调

    如果您的JS不能快速运行,那么这个模型确实会带来问题。正如您所注意到的,随着CPU的搅动,事情将变得悬而未决。因此,不要构建一个节点web应用程序,它会在运行中进行大量密集的计算

    但是,您可以将事物重构为异步的。也许您有一个独立的节点脚本,可以为您进行计算,完成后会有一个回调。然后,您的web应用程序可以将该脚本作为子进程启动,告诉它做一些事情,并在完成后提供一个回调来运行。你现在有一种伪造的线索,以一种迂回的方式


    在几乎所有的web应用程序技术中,您都不希望在运行中进行复杂而激烈的计算。即使有适当的线程,这也是一场失败的战斗。相反,你必须制定战略。在后台进行计算,或者在主web应用程序进程之外的cron作业上定期进行计算


    您指出的东西在理论上是缺陷,但在实践中,只有当您做得不对时,它才真正成为问题。

    Node.js是单线程的。这意味着任何阻塞主线程的操作都需要在主线程之外完成

    在实践中,这仅仅意味着对繁重的计算使用回调,就像对I/O使用回调一样

    对于Instance,这里是节点bcrypt的API

    var bcrypt = require('bcrypt');
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash("B4c0/\/", salt, function(err, hash) {
            // Store hash in your password DB.
        });
    });
    

    Mozilla角色在生产中使用的角色

    1)No 2)No 3)即使你做错了,也只有JS是单线程的。如果你要扩展Node.JS应用程序,你可能会使用类似cluster的东西运行多个进程,这允许你利用多个内核。值得指出的是,这是可行的,因为bcrypt模块在内部使用线程。仅仅使操作异步是不够的。