ForgeTotal.js 5
ro

Total.js 5

Rulează muncă grea într-un thread sau într-un proces copil

Total.js 5 · total5@0.0.19 workerthreadperformance Executată cu Total.js 5

Node.js rulează codul tău pe un singur thread, deci un calcul lung blochează orice cerere. NEWTHREAD(name, data) pornește workers/<name>.js într-un thread worker și returnează un Worker standard din Node.js: trimite-i mesaje cu worker.postMessage(value), primește răspunsurile cu worker.on('message', fn) și oprește-l cu worker.kill(). Al doilea argument (data) este dat workerului ca date inițiale. NEWFORK(name) are aceeași formă, dar pornește un proces copil separat, izolat de procesul principal (o cădere a lui nu afectează aplicația ta).

În fișierul workerului, NEWTHREAD() fără argumente returnează handle-ul workerului: worker.data conține datele inițiale, worker.message = fn primește mesajele, iar worker.postMessage(value) răspunde. Transmite un nume cu prefixul ~ pentru a folosi un fișier după cale în loc de 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 });
}