【发布时间】:2023-04-05 13:06:01
【问题描述】:
我在一篇文章中读到 Node.js 是单线程的。问题是如果我们在不同的端口运行多个 Node.js 文件会怎样?他们有自己的线程还是全部都在 Node.js 主线程下? 有人可以阐明我现在处于黑暗面的主题。
【问题讨论】:
我在一篇文章中读到 Node.js 是单线程的。问题是如果我们在不同的端口运行多个 Node.js 文件会怎样?他们有自己的线程还是全部都在 Node.js 主线程下? 有人可以阐明我现在处于黑暗面的主题。
【问题讨论】:
问题是如果我们在不同的端口上运行多个 Node.js 文件会怎样?他们有自己的线程还是全部都在 Node.js 主线程下?
根据您的问题,在我看来,您实际上是在启动多个 Node.js 进程。在这些情况下,它们将像您系统上的任何其他多进程集一样工作,并且您的操作系统将尝试平衡所有内核和/或 CPU 之间的负载。
我在一篇文章中读到 Node.js 是单线程的。
这有点复杂。虽然 Node.js 使用的 V8 JavaScript 引擎确实在单线程中运行您的 JavaScript,但许多 Node.js 库调用本机代码,可以使用任意多的线程。 Node.js 的这些内部结构使用线程池和多线程处理磁盘和网络 IO 以及其他任务。
Node.js 真正大放异彩的应用程序是那些通常受 IO 限制的应用程序。在这些情况下,您无需为它编写任何代码即可获得多线程的许多好处。例如,当您向磁盘发出多个请求时,Node.js 将使用多个线程来处理该数据的缓冲和管理,同时不会阻塞您的主 JavaScript 线程。
在我的许多应用程序中,我发现我可以充分利用 8 核机器,而无需编写任何代码来启动子进程。 Node 的内部多线程为我完成了所有工作。您的里程会因申请而异。
我对过去的一个问题写了不同的解释,您可能会觉得有帮助:https://stackoverflow.com/a/19324665/362536
【讨论】:
http://nodejs.org/api/cluster.html
Node 的单个实例在单个线程中运行。为了利用多核系统,用户有时需要启动 Node 进程集群来处理负载。
集群模块允许您轻松创建所有共享服务器端口的子进程。
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
这意味着你必须自己架构,所以如果你想在不同的线程中监听不同的端口,要么使用cluster要么使用child_process。
【讨论】:
master 分叉 child_process 来利用多核。有了端口,他的答案就在child processes shares server port。