ForgeTotal.js 5
pt

Total.js 5

Executar trabalho pesado numa thread ou num processo filho

Total.js 5 · total5@0.0.19 workerthreadperformance Executada com o Total.js 5

O Node.js executa o seu código numa só thread, por isso um cálculo longo bloqueia todos os pedidos. NEWTHREAD(name, data) inicia workers/<name>.js numa thread worker e devolve um Worker normal do Node.js: envie-lhe mensagens com worker.postMessage(value), receba as respostas com worker.on('message', fn) e pare-o com worker.kill(). O segundo argumento (data) é entregue ao worker como dados iniciais. NEWFORK(name) tem a mesma forma mas inicia um processo filho separado, isolado do processo principal (uma falha nele não afeta a sua aplicação).

Dentro do ficheiro do worker, NEWTHREAD() sem argumentos devolve o handle do worker: worker.data contém os dados iniciais, worker.message = fn recebe as mensagens e worker.postMessage(value) responde. Passe um nome com o prefixo ~ para usar um ficheiro pelo seu caminho em vez 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 });
}