NodeJS 服务器是否使用多线程?

Does a NodeJS server use multithreading?

我有一个关于 nodeJS 的问题(特别是关于版本 9)。使用这个项目 -- https://github.com/howardchung/jsminer,我正在 运行 安装一个 nodeJS 服务器,如果这是正确的词。我通过 运行ning

在我的命令留置权上旋转它
node index.js

这是我唯一的进程运行。在 "index.js" 文件中,express 用于创建要监听的端点,例如

var express = require('express');
var app = express();
...
app.get('/work', function(req, res) {
    console.log("client requested work!");
    //send constructed block to client
    //client mines block
    //when client succeeds, client hits /submit
    res.json({
        result: curr_block
    });
});

如果我打电话

http://localhost:5000/work

在同一时间,一个呼叫是否会被阻塞,直到另一个呼叫完成或它们被同时处理。也就是说,是否启用了多线程?

它的某些底层 C++ 组件可以,但您不会看到该功能,因此您不能自己编写线程代码。 Javascript 语言本身不支持线程。

要利用多个 CPU,您可以生成单独的子进程或 运行 同一进程的许多并行实例。

换句话说你做不到multithreading; but you can still do multiprocessing

...does one call get blocked until the other call completes or are they handled simultaneously.

假设您的请求主要是I/O-bound (use the database, filesystem etc..) instead of CPU-bound(执行加密、解密、压缩等)。同时接受

Node.js 提供了一种 pseudo-concurrency 类型,通过使用 Event Loop and the programmer writing code in an Event-driven programming 风格(回调、承诺等...),而不是为每个请求创建单独的线程。

过于简单化是这样的:

  • 请求 A 到达并放入事件队列。
  • Request A 从数据库请求数据。
  • 请求 B 到达并放入事件队列。
  • 请求B向数据库请求数据。
  • 请求 B 的数据库请求到达,请求 B 收到数据。
  • 请求 A 的数据库请求到达,请求 A 已提供数据。

如您所见,Node 接受并发请求并在必要时为每个请求提供服务。在服务另一个请求之前,它不会停止接受传入的请求。这是 non-blocking.

然而,上述场景主要是 I/O-bound 示例,其中 Node.js 并发模型大放异彩。

相比之下,如果您的请求主要是 CPU-bound(而不是 I/O 绑定),那么您 冻结 单线程(记住 Node.js 是 single-threaded) 它 运行 开启,请求无法被接受并且您的服务器在单个请求 CPU 计算期间“冻结”。

...In other words, is multithreading enabled?

假设很多 Node 的底层库(libuv for example) do use multiple threads, however the ability to directly control threads is not exposed to the user (although in theory you can write native C++ addons 你可以在其中利用多线程)。

如果您担心您没有利用所有 CPU 个内核,您应该查看 cluster module 以启动多个 Node.js 服务器进程。在这种情况下,问题就解决了;在大多数情况下,O/S 调度程序应该将进程分散到可用的核心;然而,这被称为 multi-processing,而不是多线程。