node.js - Nodejs 是单线程的这一事实究竟意味着什么?

标签 node.js

NodeJS 网站如下所述。重点是我的。

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

尽管我喜欢 NodeJS,但我不明白为什么它比 Python、Java 甚至 PHP 等现有技术更适合可扩展的应用程序。

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

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

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

如果您还发布其他技术在这些情况下如何执行(即 NodeJS),我将不胜感激。

最佳答案

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

Because all JS code will run in a single thread NodeJS is unsuitable for applications where there is less IO and lots of computation ?

是的。单线程意味着如果您在 JS 代码中努力处理大量数据,那么您就会阻塞其他一切。那很糟糕。但这对于大多数 Web 应用程序来说并不常见。

If I am writing a web application using nodejs and there are 100 open connections each performing a pure computation requiring 100ms, at least one of them will take 10s to finish?

是的。 10 秒的 CPU 时间。

If your machine has 10 cores but if you are running just one nodeJS instance your other 9 CPUs are sitting ducks?

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


问题是,大多数时候 Web 应用程序不进行计算。如果您的应用程序设计良好,则可以非常快速地响应单个请求。如果您必须获取一些东西来执行此操作(数据库、文件、远程服务),那么您不必等待该获取返回后再处理下一个请求。

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

如果你的JS不能快速运行,那么这个模型确实会带来问题。正如您所注意到的,当 CPU 搅动时,事情就会挂起。因此,不要构建一个动态执行大量密集计算的 Node Web 应用程序。

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


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

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

关于node.js - Nodejs 是单线程的这一事实究竟意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16802624/

相关文章:

node.js - Node.js 中的 Memcache 返回大小不同的对象

javascript - 如何使用当前设置实现 tic tac toe 获胜条件?

node.js - 如何从 npm install 获取更多信息?

node.js - 从 NodeJS 或 Play 安排 Spark 作业!服务器

javascript - ES6 导入、导出 = 错误 : invalid argument

javascript - 未处理的拒绝 SequelizeEagerLoadingError : modalB is not associated to modelA

javascript - 连接两个(或更多)字符串并产生相同的字符串,无论顺序如何

javascript - 使用 NodeJS 和 Socket.io 的 CPU 密集型任务架构

javascript - Sequelize 从多个表中提取数据并作为对象传递以在 EJS 中呈现

node.js - 在 React 中开始使用 Material UI 的步骤