nodejs是单线程这一事实究竟是什么意思?

时间:2013-05-28 22:37:27

标签: node.js

NodeJS网站说明如下。重点是我的。

  

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

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

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

所以需要回答的真正问题是:

  1. 因为所有JS代码都在单个线程中运行,所以NodeJS不适合IO较少且计算量较大的应用程序?
  2. 如果我正在使用nodejs编写Web应用程序,并且有100个打开的连接,每个执行一个需要100毫秒的纯计算,其中至少有一个需要10秒才能完成?
  3. 如果你的机器有10个核心,但如果你只运行一个nodeJS实例,那么你的其他9个CPU就是鸭子?
  4. 如果您还发布其他技术在这些情况下如何执行即可获得NodeJS,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

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

  

因为所有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作业上定期进行计算。

你指出的事情在理论上是有缺陷的,但在实践中,如果你做得不对,它真的只会成为一个问题。

答案 1 :(得分:2)

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

实际上,这意味着使用回调进行大量计算,就像使用I / O回调一样。

对于instace,这里是节点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 Persona使用哪种产品。 See their code here