ForgeTotal.js 5
de

Total.js 5

Schwere Arbeit in einem Thread oder Kindprozess ausführen

Total.js 5 · total5@0.0.19 workerthreadperformance Mit Total.js 5 ausgeführt

Node.js führt deinen Code in einem Thread aus, eine lange Berechnung blockiert also jede Anfrage. NEWTHREAD(name, data) startet workers/<name>.js in einem Worker-Thread und gibt einen Standard-Worker von Node.js zurück: Sende ihm Nachrichten mit worker.postMessage(value), empfange Antworten mit worker.on('message', fn) und stoppe ihn mit worker.kill(). Das zweite Argument (data) wird dem Worker als Startdaten übergeben. NEWFORK(name) hat dieselbe Form, startet aber einen separaten Kindprozess, der vom Hauptprozess isoliert ist (ein Absturz darin beeinträchtigt deine App nicht).

In der Worker-Datei gibt NEWTHREAD() ohne Argumente das Worker-Handle zurück: worker.data enthält die Startdaten, worker.message = fn empfängt Nachrichten und worker.postMessage(value) antwortet. Übergib einen Namen mit dem Präfix ~, um eine Datei per Pfad statt workers/<name>.js zu verwenden.

workers/sum.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 });
};
controllers/sum.js
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 });
}