Я пытаюсь запустить кластер Node.js в моем приложении Express, но только для одной конкретной функции.
Мое приложение - это стандартное приложение Express, созданное с помощью генератора приложений Express.
Мое приложение изначально очищает веб-сайт электронной коммерции, чтобы получить список категорий в массиве. Я хочу иметь возможность одновременно обрабатывать продукты каждой категории, используя дочерние процессы.
Я не хочу, чтобы все приложение Express находилось внутри дочерних процессов. Когда приложение запускается, я хочу, чтобы только один процесс очистил начальные категории. Как только это будет сделано, я хочу, чтобы только функция, которая очищает продукты, запускалась одновременно в кластере.
Я попробовал следующее:
Delegation-controller.js
var {em} = require('./entry-controller');
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
class DelegationController {
links = [];
constructor() {
em.on('PageLinks', links => {
this.links = links;
this.startCategoryCrawl();
});
}
startCategoryCrawl() {
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
console.log(`Worker ${process.pid} started`);
process.exit();
}
}
}
module.exports = DelegationController;
Но потом я получил ошибку:
/ecommerce-scraper/bin/www:58
throw error;
^
Error: bind EADDRINUSE null:3000
Я предполагаю, что он пытается запустить экспресс-сервер снова, но он используется.
Могу ли яделать то, что я пытаюсь сделать, или я неправильно понимаю, как работают кластеры Node.js?