Узел JS с CouchDB для разбора лотов - PullRequest
1 голос
/ 22 февраля 2012

Моя команда и я играем с NodeJS (с jsdom / jQuery) и анализируем множество HTML-документов, хранящихся в CouchDB. NodeJS является однопоточным, поэтому наличие 8 ядер в сервировке на первых порах совсем не помогает, вот где мне было интересно, как лучше создать дочерние процессы (возможно, рабочие?) Для обработки отдельного файла, когда он извлекается из CouchDB?

Вот мой мыслительный процесс:

  1. Основной скрипт NodeJS циклически просматривает CouchDB, получая файлы HTML из документов каждые X минут
  2. Создать процесс для анализа (jsdom / jQuery) и сохранения результатов из каждого файла HTML

Мы вообще не запускаем веб-сервер для обработки всего этого (вся командная строка), поэтому я не уверен, как это обрабатывать, за исключением универсальной «настройки CRON, чтобы просто запускать каждое задание синтаксического анализа». Кажется, что рабочие обычно используются для обработки запросов, поступающих с веб-сервера.

Мысли

1 Ответ

2 голосов
/ 22 февраля 2012

Используйте cluster

var cluster = require("cluster");
var numCPUs = require('os').cpus().length;
var htmlDocs = [...];

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('death', function(worker) {
    console.log('worker ' + worker.pid + ' died');
  });
} else {
  for (var i = process.env.NODE_WORKER_ID; i < htmlDocs.length; i+=numCPUs) {
    couch.doWork(htmlDocs[i]);
  }
}

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

Обратите внимание, как мы увеличиваем i на количество процессов.Это означает, что работник 1 выполняет 1, 5, 9 и т. Д., Работник 2 выполняет 2, 6, 10 и т. Д.

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