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

> Utilisez NEWTHREAD() pour démarrer un thread worker, lui envoyer des messages et lire ses réponses sans bloquer le processus principal.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: e4b05ba7f68f3db38ded601104ad25f4857bdb0b823119058b30c1fa98e72afb
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

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`.

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

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