Кластер Node.js только для определенной функции в приложении Express - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь запустить кластер 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?

1 Ответ

0 голосов
/ 03 ноября 2019

Я считаю, что это не тот случай, когда вы используете модуль кластера. Вместо этого вам нужен модуль child_process. Этот модуль позволяет вам создать отдельный процесс. Вот документация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...