ForgeTotal.js 5
fr

Total.js 5

Exécuter un travail lourd dans un thread ou un processus enfant

Total.js 5 · total5@0.0.19 workerthreadperformance Exécutée avec Total.js 5

Node.js exécute votre code sur un seul thread, donc un long calcul bloque chaque requête. NEWTHREAD(name, data) démarre workers/<name>.js dans un thread worker et renvoie un Worker Node.js standard : envoyez-lui des messages avec worker.postMessage(value), recevez les réponses avec worker.on('message', fn) et arrêtez-le avec worker.kill(). Le second argument (data) est transmis au worker comme données initiales. NEWFORK(name) a la même forme mais démarre un processus enfant séparé, isolé du processus principal (un plantage de ce dernier n'affecte pas votre application).

Dans le fichier du worker, NEWTHREAD() sans argument renvoie le descripteur du worker : worker.data contient les données initiales, worker.message = fn reçoit les messages et worker.postMessage(value) répond. Passez un nom préfixé par ~ pour utiliser un fichier par son chemin au lieu 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 });
}