Работая в очередной раз с модулем кластера, я столкнулся с необходимостью обмена сообщениями между рабочими процессами.
К сожалению, стандартный функционал модуля позволяет отправлять сообщения только от мастер-процесса к рабочему, и в обратном направлении.
При этом никакого ответа на сообщение получить нет возможности, а очень хотелось бы.
Итак, я написал модуль кластера-концентратора.
Возможно, это будет кому-то полезно.
Модуль позволяет
- Отправлять сообщения мастер-> работник, рабочий-> мастер, мастер-> мастер
- Отправляйте запросы и получайте ответы (через обратный вызов)
- Используйте эксклюзивные блокировки клавиш (критические разделы)
Обмен сообщениями
Самая простая функциональность — это просто отправка сообщений другим процессам.Можно отправлять сообщения от мастера к работнику, от работника к мастеру, от мастера-> мастера.
var Hub = require('cluster-hub'); var cluster = require('cluster'); var hub = new Hub(cluster); if (cluster.isMaster) { var worker = cluster.fork(); hub.on('master-to-master', function (data) { console.log('master-to-master received'); }); hub.on('worker-to-master', function (data) { console.log('worker-to-master received'); }); hub.sendToMaster('master-to-master', 1); hub.sendToWorker(worker, 'master-to-worker'); } else { hub.on('master-to-worker', function () { console.log('master-to-worker received');; process.exit(); }); hub.sendToMaster('worker-to-master', 2); }
Отправка запросов
Этот функционал позволяет отправить запрос от одного процесса к другому и получить результат внутри функции обратного вызова.
Пример будет говорить сам за себя: var Hub = require('cluster-hub');
var cluster = require('cluster');
var hub = new Hub(cluster);
if (cluster.isMaster) {
// in master process
hub.on('sum', function (data, sender, callback) {
callback(null, data.a + data.b);
});
var worker = cluster.fork();
} else {
//in worker process
hub.requestMaster('sum', {a: 1, b:2}, function (err, sum) {
console.log('Sum in worker: ' + sum);
process.exit();
});
}
По аналогии вы можете использовать метод requestWorker для вызова метода рабочего процесса из главного процесса.
Ээксклюзивные замки/критические секции
Эта функциональность позволяет одному из процессов (неважно, главному или одному из рабочих) получить монопольный доступ к ресурсу.Если рабочий процесс перестанет работать без вызова разблокировки заблокированного ресурса, ресурс будет освобожден автоматически.
var Hub = require('cluster-hub');
var cluster = require('cluster');
var hub = new Hub(cluster);
if (cluster.isMaster) {
var worker = cluster.fork();
hub.lock('foo', function (unlock) {
console.log('foo lock in master');
setTimeout(unlock, 1000);
});
} else {
hub.lock('foo', function (unlock) {
console.log('foo lock in worker 1');
setTimeout(unlock, 500);
});
hub.lock('bar', function (unlock) {
console.log('bar lock in worker');
unlock();
})
hub.lock('foo', function (unlock) {
console.log('second foo lock in worker');
unlock();
process.exit();
})
}
Исходные коды модуля доступны здесь: github.com/sirian/node-cluster-hub
Теги: #node.js #cluster #cluster-hub #JavaScript #node.js
-
Принципы Домашнего Танкостроения
19 Oct, 24 -
Как Internet Explorer Проходит Тесты Html5
19 Oct, 24 -
42% Людей, Которые Не Покупают Ваш Продукт
19 Oct, 24