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

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

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

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

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

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

  1. 因为所有JS代码都将在单个线程中运行,所以NodeJS不适合IOless,计算量大的应用程序。
  2. 如果我正在使用nodejs编写一个Web应用程序,并且有100个打开的连接,每个连接都需要100ms执行一次纯粹的计算,那么至less其中一个连接需要10s才能完成?
  3. 如果你的机器有10个内核,但是如果你只运行一个nodeJS实例,那么你的其他9个CPU就坐鸭子了?

我将不胜感激,如果你也发布其他技术如何执行即在这种情况下,即NodeJS。

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

在实践中,这只是意味着使用callback进行繁重的计算,就像使用callbackI / O一样。

举例来说,这里是节点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. }); }); 

哪个Mozillaangular色在生产中使用。 在这里看他们的代码 。

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

因为所有JS代码都将在单个线程中运行,所以NodeJS不适合IOless,计算量大的应用程序。

是啊。 单线程意味着如果你正在处理JS代码中的大量数据,就会阻塞其他所有的东西。 而这很糟糕。 但是这对于大多数Web应用程序来说并不典型。

如果我正在使用nodejs编写一个Web应用程序,并且有100个打开的连接,每个连接都需要100ms执行一次纯粹的计算,那么至less其中一个连接需要10s才能完成?

是的。 10秒的CPU时间。

如果你的机器有10个内核,但是如果你只运行一个nodeJS实例,那么你的其他9个CPU就是坐鸭子了?

我不确定。 V8引擎可能会有一些优化,利用多核心,程序员是透明的。 但我怀疑它。


事情是,大多数时候一个Web应用程序不计算。 如果您的应用程序devise良好,则可以快速响应一个请求。 而且如果你必须要获取这些信息(db,文件,远程服务),那么在处理下一个请求之前,你不必等待那个提取返回。

所以在完成的各个阶段,由于发生I / Ocallback的时候,你可能会在不同的阶段同时有很多请求。 尽pipe一次只有一个请求正在运行JS代码,但该代码应该尽快完成它所需的操作,退出运行循环,并等待下一个事件callback。

如果你的JS不能快速运行,那么这个模型确实会造成一个问题。 正如你所注意到的,随着CPU的搅动,事情将会被挂起。 所以不要build立一个节点的Web应用程序,它可以在运行中进行大量的计算。

但是,你可以重构的东西是asynchronous的。 也许你有一个独立的节点脚本,可以为你做计算,完成后有callback。 然后,您的Web应用程序可以将该脚本作为subprocess启动,告诉它做些什么,并在完成时提供callback来运行。 你现在有一些虚假的线程,围绕一个方向。


在几乎所有的Web应用程序技术中,您都不想在运行中进行复杂而紧张的计算。 即使正确的线程,这是一场失败的战斗。 相反,你必须制定战略。 在主要Web应用程序本身之外,在后台执行计算,或定期执行cron作业。

你指出的东西在理论上是有缺陷的,但是在实践中,如果你做得不对,那才真正成为一个问题。