Zdieľajte niekoľko pracovných vlákien cez NEWTHREADPOOL()
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 cezworker.postMessage(value), odpoveď prečítajte cezworker.once('message', fn)a keď skončíte, zavolajterelease(): 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 sworker(a worker máworker.release()), takže funguje sawait. - Ú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.workersje 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.
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 });
};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 });
}