ForgeTotal.js 5
sv

Total.js 5

Köra tungt arbete i en tråd eller en barnprocess

Total.js 5 · total5@0.0.19 workerthreadperformance Körd med Total.js 5

Node.js kör din kod i en tråd, så en lång beräkning blockerar alla förfrågningar. NEWTHREAD(name, data) startar workers/<name>.js i en workertråd och returnerar en vanlig Node.js-Worker: skicka meddelanden till den med worker.postMessage(value), ta emot svar med worker.on('message', fn) och stoppa den med worker.kill(). Det andra argumentet (data) lämnas till workern som startdata. NEWFORK(name) har samma form men startar en separat barnprocess som är isolerad från huvudprocessen (en krasch i den påverkar inte din app).

Inuti workerfilen returnerar NEWTHREAD() utan argument workerns handtag: worker.data innehåller startdatan, worker.message = fn tar emot meddelanden och worker.postMessage(value) svarar. Ange ett namn med prefixet ~ för att använda en fil via dess sökväg i stället för workers/<name>.js.

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 });
}