# Rulează muncă grea într-un thread sau într-un proces copil

> Folosește NEWTHREAD() pentru a porni un thread worker, a-i trimite mesaje și a citi răspunsurile fără a bloca procesul principal.

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

Node.js rulează codul tău pe un singur thread, deci un calcul lung blochează orice cerere. `NEWTHREAD(name, data)` pornește `workers/<name>.js` într-un thread worker și returnează un `Worker` standard din Node.js: trimite-i mesaje cu `worker.postMessage(value)`, primește răspunsurile cu `worker.on('message', fn)` și oprește-l cu `worker.kill()`. Al doilea argument (`data`) este dat workerului ca date inițiale. `NEWFORK(name)` are aceeași formă, dar pornește un proces copil separat, izolat de procesul principal (o cădere a lui nu afectează aplicația ta).

În fișierul workerului, `NEWTHREAD()` fără argumente returnează handle-ul workerului: `worker.data` conține datele inițiale, `worker.message = fn` primește mesajele, iar `worker.postMessage(value)` răspunde. Transmite un nume cu prefixul `~` pentru a folosi un fișier după cale în loc 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 });
}
```
