gpt4 book ai didi

node.js - NodeJS 服务器使用多线程吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:04 26 4
gpt4 key购买 nike

我有一个关于 NodeJS 的问题(特别是关于版本 9 的问题)。使用这个项目--https://github.com/howardchung/jsminer ,我正在运行一个 NodeJS 服务器,如果这是正确的词的话。我通过运行来启动我的命令留置权

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 ;但你仍然可以这样做multiprocessing .

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

假设您的请求主要是 I/O-bound,它们会同时被接受。 (使用数据库、文件系统等..)而不是 CPU-bound (执行加密、解密、压缩等...)。

Node.js 提供了一种通过使用Event Loop 来促进的伪并发。程序员在 Event-driven programming 中编写代码风格(回调、 promise 等),而不是为每个请求创建单独的线程。

过度简化会是这样的:

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

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

然而,上述场景主要是 I/O 绑定(bind)的示例,其中 Node.js 并发模型大放异彩。

相反,如果您的请求主要受 CPU 限制(而不是 I/O 限制),那么您卡住它运行的单个线程(记住 Node.js 是单线程),请求将无法被接受,并且您的服务器在该单个请求 CPU 计算期间“卡住”。

...In other words, is multithreading enabled?

假设许多 Node 的底层库(例如 libuv)确实使用多线程,但是直接控制线程的能力并未向用户公开(尽管理论上您可以编写 native C++ addons 来利用多线程)。

如果您担心没有利用所有 CPU 核心,则应该查看 cluster module启动多个 Node.js 服务器进程。在这种情况下,问题就从你手中解决了;在大多数情况下,操作系统调度程序应该将进程分布在可用的内核上;然而,这称为多处理,而不是多线程。

关于node.js - NodeJS 服务器使用多线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49141259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com