# Schwere Arbeit in einem Thread oder Kindprozess ausführen

> Nutze NEWTHREAD(), um einen Worker-Thread zu starten, ihm Nachrichten zu senden und die Antworten zu lesen, ohne den Hauptprozess zu blockieren.

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

Node.js führt deinen Code in einem Thread aus, eine lange Berechnung blockiert also jede Anfrage. `NEWTHREAD(name, data)` startet `workers/<name>.js` in einem Worker-Thread und gibt einen Standard-`Worker` von Node.js zurück: Sende ihm Nachrichten mit `worker.postMessage(value)`, empfange Antworten mit `worker.on('message', fn)` und stoppe ihn mit `worker.kill()`. Das zweite Argument (`data`) wird dem Worker als Startdaten übergeben. `NEWFORK(name)` hat dieselbe Form, startet aber einen separaten Kindprozess, der vom Hauptprozess isoliert ist (ein Absturz darin beeinträchtigt deine App nicht).

In der Worker-Datei gibt `NEWTHREAD()` ohne Argumente das Worker-Handle zurück: `worker.data` enthält die Startdaten, `worker.message = fn` empfängt Nachrichten und `worker.postMessage(value)` antwortet. Übergib einen Namen mit dem Präfix `~`, um eine Datei per Pfad statt `workers/<name>.js` zu verwenden.

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