Использование кластера в модуле Node
ОБНОВИТЬ: Даже если этот конкретный сценарий не является реалистичным, согласно комментариям, мне все еще интересно, как можно написать модуль, который использует кластеризацию, не перезапуская родительский процесс каждый раз.
Я пытаюсь написать модуль Node.js под названиемmass-request
это ускоряет большое количество HTTP-запросов, распределяя их по дочерним процессам.
Я надеюсь, что снаружи это работает так.
var mr = require("mass-request"),
scraper = mr();
for (var i = 0; i < my_urls_to_visit.length; i += 1) {
scraper.add(my_urls_to_visit[i], function(resp) {
// do something with response
}
}
Для начала я собрал скелет для модуля массового запроса.
var cluster = require("cluster"),
numCPUs = require("os").cpus().length;
module.exports = function() {
console.log("hello from mass-request!");
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i += 1) {
var worker = cluster.fork();
}
return {
add: function(url, cb) {}
}
} else {
console.log("worker " + process.pid + " is born!");
}
}
Затем я проверяю это так в тестовом скрипте:
var m = mr();
console.log("hello from test.js!", m);
Я ожидал увидеть "привет от массовой просьбы!" залогинился четыре раза (как на самом деле). К моему изумлению, я также вижу «привет из test.js» четыре раза. Понятно, я не понимаю, какcluster.fork()
работает. Это перезапускает весь процесс, а не только функцию, которая вызывает его в первый раз?
Если да, то как можно использовать кластеризацию в модуле, не беспокоя человека, который использует этот модуль с грязной многопроцессорной логикой?