# Nehéz munka futtatása szálban vagy gyermekfolyamatban

> A NEWTHREAD()-del indíts worker szálat, küldj neki üzeneteket és olvasd a válaszokat anélkül, hogy a fő folyamatot blokkolnád.

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

A Node.js a kódodat egyetlen szálon futtatja, ezért egy hosszú számítás minden kérést blokkol. A `NEWTHREAD(name, data)` a `workers/<name>.js` fájlt egy worker szálban indítja, és egy szokásos Node.js `Worker`t ad vissza: küldj neki üzeneteket a `worker.postMessage(value)`-val, fogadd a válaszokat a `worker.on('message', fn)`-nel, és állítsd le a `worker.kill()`-lel. A második argumentum (`data`) kezdőadatként kerül a workerhez. A `NEWFORK(name)` ugyanilyen alakú, de külön gyermekfolyamatot indít, amely el van szigetelve a fő folyamattól (az összeomlása nem érinti az alkalmazásodat).

A worker fájljában az argumentum nélküli `NEWTHREAD()` a worker handle-t adja vissza: a `worker.data` a kezdőadatokat tartalmazza, a `worker.message = fn` fogadja az üzeneteket, a `worker.postMessage(value)` pedig válaszol. Adj meg `~` előtagú nevet, hogy a `workers/<name>.js` helyett útvonallal megadott fájlt használj.

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