50 lines
1.2 KiB
JavaScript
50 lines
1.2 KiB
JavaScript
'use strict';
|
|
|
|
const fork = require('child_process').fork;
|
|
|
|
const config = require('config');
|
|
const log = require('npmlog');
|
|
const workers = new Set();
|
|
|
|
function spawn(callback) {
|
|
let processes = Math.max(Number(config.queue.processes) || 1, 1);
|
|
let spawned = 0;
|
|
let returned = false;
|
|
|
|
if (processes > 1 && !config.redis.enabled) {
|
|
log.error('Queue', '%s processes requested but Redis is not enabled, spawning 1 process', processes);
|
|
processes = 1;
|
|
}
|
|
|
|
let spawnSender = function () {
|
|
if (spawned >= processes) {
|
|
if (!returned) {
|
|
returned = true;
|
|
return callback();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
let child = fork(__dirname + '/../services/sender.js', []);
|
|
let pid = child.pid;
|
|
workers.add(child);
|
|
|
|
child.on('close', (code, signal) => {
|
|
spawned--;
|
|
workers.delete(child);
|
|
log.error('Child', 'Sender process %s exited with %s', pid, code || signal);
|
|
// Respawn after 5 seconds
|
|
setTimeout(() => spawnSender(), 5 * 1000).unref();
|
|
});
|
|
|
|
spawned++;
|
|
setImmediate(spawnSender);
|
|
};
|
|
|
|
spawnSender();
|
|
}
|
|
|
|
module.exports = {
|
|
workers,
|
|
spawn
|
|
};
|