# Zdieľajte niekoľko pracovných vlákien cez NEWTHREADPOOL()

> Spustite pevný počet workerov, požičajte si jedného cez pool.exec(), keď je práca, vráťte ho cez release() a nechajte ostatné úlohy čakať na voľného workera.

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

`NEWTHREAD()` spustí jedného workera. Keď veľa požiadaviek potrebuje tú istú náročnú úlohu, worker na každú požiadavku je príliš veľa a jediný worker ich núti čakať jednu na druhú bez akéhokoľvek poradia. `NEWTHREADPOOL(name, count, [isfork])` spustí `count` workerov z `workers/<name>.js` (vlákno; s `isfork` nastaveným na `true` podproces, ako `NEWFORK()`) a rozdáva ich po jednom.

- `pool.exec(function(worker, release) {})` počká, kým je worker voľný, a zavolá vašu funkciu s ním. Pošlite mu prácu cez `worker.postMessage(value)`, odpoveď prečítajte cez `worker.once('message', fn)` a **keď skončíte, zavolajte `release()`**: worker sa vráti do poolu a prevezme ho ďalšia čakajúca úloha.
- Bez funkcie `pool.exec()` vráti promise, ktorý sa vyrieši s `worker` (a worker má `worker.release()`), takže funguje s `await`.
- Úlohy sa obsluhujú v poradí, v akom o workera požiadali. Pool nezaraďuje správy workera do fronty: v jednom okamihu ho má jedna úloha.
- Pool je uložený aj v `F.workers[name]`. `pool.workers` je zoznam workerov.

Súbor workera je rovnaký ako pri `NEWTHREAD()`: `NEWTHREAD()` v ňom vráti handle s `worker.message` a `worker.postMessage()`. Tu každý worker sčíta čísla a povie, ktoré vlákno to urobilo.

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