# Executar trabalho pesado numa thread ou num processo filho

> Use NEWTHREAD() para iniciar uma thread worker, enviar-lhe mensagens e ler as respostas sem bloquear o processo principal.

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

O Node.js executa o seu código numa só thread, por isso um cálculo longo bloqueia todos os pedidos. `NEWTHREAD(name, data)` inicia `workers/<name>.js` numa thread worker e devolve um `Worker` normal do Node.js: envie-lhe mensagens com `worker.postMessage(value)`, receba as respostas com `worker.on('message', fn)` e pare-o com `worker.kill()`. O segundo argumento (`data`) é entregue ao worker como dados iniciais. `NEWFORK(name)` tem a mesma forma mas inicia um processo filho separado, isolado do processo principal (uma falha nele não afeta a sua aplicação).

Dentro do ficheiro do worker, `NEWTHREAD()` sem argumentos devolve o handle do worker: `worker.data` contém os dados iniciais, `worker.message = fn` recebe as mensagens e `worker.postMessage(value)` responde. Passe um nome com o prefixo `~` para usar um ficheiro pelo seu caminho em vez 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 });
}
```
