# Zwaar werk uitvoeren in een thread of kindproces

> Gebruik NEWTHREAD() om een workerthread te starten, er berichten naartoe te sturen en de antwoorden te lezen zonder het hoofdproces te blokkeren.

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

Node.js voert je code uit op één thread, dus een lange berekening blokkeert elk verzoek. `NEWTHREAD(name, data)` start `workers/<name>.js` in een workerthread en geeft een standaard Node.js-`Worker` terug: stuur er berichten naartoe met `worker.postMessage(value)`, ontvang antwoorden met `worker.on('message', fn)` en stop hem met `worker.kill()`. Het tweede argument (`data`) wordt als startgegevens aan de worker meegegeven. `NEWFORK(name)` heeft dezelfde vorm maar start een apart kindproces, dat van het hoofdproces is geïsoleerd (een crash erin raakt je app niet).

In het workerbestand geeft `NEWTHREAD()` zonder argumenten de worker-handle terug: `worker.data` bevat de startgegevens, `worker.message = fn` ontvangt berichten en `worker.postMessage(value)` antwoordt. Geef een naam met het voorvoegsel `~` om een bestand via zijn pad te gebruiken in plaats van `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 });
}
```
