nyks
Version:
nodejs exupery style
51 lines (40 loc) • 1.24 kB
JavaScript
;
//st exupery style
module.exports = function(thunk, workers = 1) {
var workerChain = [], slots = workers;
var process = async function() {
await pickworker('push');
var ret = await thunk.apply(this, arguments);
freeworker();
return ret;
};
var unshift = async function() {
await pickworker('unshift');
var ret = await thunk.apply(this, arguments);
freeworker();
return ret;
};
var pickworker = function (way) {
if(!slots) //no available worker, waiting
return new Promise(resolve => workerChain[way](resolve));
return Promise.resolve(slots--); //worker id
};
var freeworker = function() {
slots++;
if(workerChain.length)
workerChain.shift()(pickworker('push'));
else if(slots == workers && process.drain)
process.drain();
};
var out = process; // better candidate than {}
out.push = process; // per compatibility
out.unshift = unshift; // per compatibility
out.getLength = () => { return workerChain.length; };
//out.filter = (cb) => { workerChain = workerChain.filter(cb); };
out.drain = Function.prototype;
out.kill = () => {
workerChain = [];
out.drain = Function.prototype;
};
return out;
};