【发布时间】:2022-11-11 01:48:47
【问题描述】:
我有点困惑,因为我读到的关于 Node cluster 模块的所有示例似乎只适用于网络服务器和并发请求。否则,对于 CPU 密集型应用程序,建议使用 worker_threads 模块。
那么 I/O 文件操作呢?想象一下,我有一个包含 100 万个文件名的数组:['1.txt', '2.txt', etc., ..., '1000000.txt'],我需要进行繁重的处理,然后写入结果文件内容?
有效使用 CPU 的所有内核将处理分散到不同文件名中的不同内核的方法是什么?
通常我会使用这个:
const fs = require('fs')
const fs = require('async')
const heavyProcessing = require('./heavyProcessing.js')
const files = ['1.txt', '2.txt', ..., '1000000.txt']
async.each(files, function (file, cb) {
fs.writeFile(file, heavyProcessing(file), function (err) {
if (!err) cb()
})
}
我现在应该使用cluster 还是worker_threads?我应该如何使用它?
这行得通吗?
const fs = require('fs')
const fs = require('async')
const heavyProcessing = require('./heavyProcessing.js')
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').cpus().length;
const process = require('node:process');
if (cluster.isPrimary) {
console.log(`Primary ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
const files = ['1.txt', '2.txt', ..., '1000000.txt']
async.each(files, function (file, cb) {
fs.writeFile(file, heavyProcessing(file), function (err) {
if (!err) cb()
})
}
}
【问题讨论】:
-
这不会满足您的要求:集群中的每个进程都会处理您的所有文件。如果这是生产要求,那么编写使用工作线程池的代码可能是值得的。
-
@O.Jones 你会推荐我任何模块吗?
piscina呢? -
@O.Jones 这个呢? github.com/piscinajs/piscina/issues/270
-
我想它会起作用的。我从来没有使用过它。
-
@O.Jones 找到了它,我做了这个要点解释:gist.github.com/jfoclpf/325bb925fedf50a9cf96bd00d99e2243
标签: node.js async.js node-cluster