# Dela några arbetstrådar med NEWTHREADPOOL()

> Starta ett fast antal workers, låna en med pool.exec() när det finns arbete, lämna tillbaka den med release() och låt övriga jobb vänta på en ledig worker.

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

`NEWTHREAD()` startar en worker. När många förfrågningar behöver samma tunga jobb är en worker per förfrågan för många, och en enda worker får dem att vänta på varandra utan någon ordning. `NEWTHREADPOOL(name, count, [isfork])` startar `count` workers från `workers/<name>.js` (en tråd; med `isfork` satt till `true` en barnprocess, som `NEWFORK()`) och delar ut dem en i taget.

- `pool.exec(function(worker, release) {})` väntar tills en worker är ledig och anropar din funktion med den. Skicka arbetet till den med `worker.postMessage(value)`, läs svaret med `worker.once('message', fn)` och **anropa `release()` när du är klar**: workern går tillbaka till poolen och nästa väntande jobb tar den.
- Utan funktion returnerar `pool.exec()` ett löfte som löses med `worker` (och workern har `worker.release()`), så det fungerar med `await`.
- Jobben betjänas i den ordning de bad om det. Poolen köar inte en workers meddelanden: ett jobb i taget har den.
- Poolen finns också i `F.workers[name]`. `pool.workers` är listan över workers.

Worker-filen är densamma som för `NEWTHREAD()`: `NEWTHREAD()` i den returnerar handtaget med `worker.message` och `worker.postMessage()`. Här summerar varje worker talen och säger vilken tråd som gjorde det.

```js workers/total.js
require('total5');

const worker = NEWTHREAD();

worker.message = function(message) {
	let total = 0;
	for (let i = 1; i <= message.to; i++)
		total += i;
	worker.postMessage({ to: message.to, total: total, thread: require('worker_threads').threadId });
};
```

```js controllers/total.js
exports.install = function() {
	ROUTE('GET /total/{to}/', total);
	ROUTE('GET /await/{to}/', total_await);
	ROUTE('GET /workers/', workers);
};

const pool = NEWTHREADPOOL('total', 2);

function total($) {
	pool.exec(function(worker, release) {
		worker.once('message', function(response) {
			release();
			$.json(response);
		});
		worker.postMessage({ to: +$.params.to });
	});
}

async function total_await($) {
	const worker = await pool.exec();
	worker.once('message', function(response) {
		worker.release();
		$.json(response);
	});
	worker.postMessage({ to: +$.params.to });
}

function workers($) {
	$.json({ workers: pool.workers.length, registered: F.workers.total === pool });
}
```
