Zwaar werk uitvoeren in een thread of kindproces
Node.js voert je code uit op één thread, dus een lange berekening blokkeert elk verzoek. NEWTHREAD(name, data) start workers/<name>.js in een workerthread en geeft een standaard Node.js-Worker terug: stuur er berichten naartoe met worker.postMessage(value), ontvang antwoorden met worker.on('message', fn) en stop hem met worker.kill(). Het tweede argument (data) wordt als startgegevens aan de worker meegegeven. NEWFORK(name) heeft dezelfde vorm maar start een apart kindproces, dat van het hoofdproces is geïsoleerd (een crash erin raakt je app niet).
In het workerbestand geeft NEWTHREAD() zonder argumenten de worker-handle terug: worker.data bevat de startgegevens, worker.message = fn ontvangt berichten en worker.postMessage(value) antwoordt. Geef een naam met het voorvoegsel ~ om een bestand via zijn pad te gebruiken in plaats van workers/<name>.js.
require('total5');
const worker = NEWTHREAD();
const start = worker.data.start;
worker.message = function(message) {
let total = start;
for (let i = 1; i <= message.to; i++)
total += i;
worker.postMessage({ total: total });
};exports.install = function() {
ROUTE('GET /sum/{to}/', sum);
};
var thread = NEWTHREAD('sum', { start: 1000 });
function sum($) {
var to = +$.params.to;
var timeout = setTimeout(() => $.invalid('timeout'), 4000);
thread.once('message', function(response) {
clearTimeout(timeout);
$.json(response);
});
thread.postMessage({ to: to });
}