Współdziel kilka wątków roboczych przez NEWTHREADPOOL()
NEWTHREAD() uruchamia jednego workera. Gdy wiele żądań potrzebuje tej samej ciężkiej pracy, worker na każde żądanie to za dużo, a jeden worker sprawia, że czekają na siebie bez żadnej kolejności. NEWTHREADPOOL(name, count, [isfork]) uruchamia count workerów z workers/name.js (wątek; z isfork ustawionym na true proces potomny, jak NEWFORK()) i wydaje je po jednym.
pool.exec(function(worker, release) {})czeka, aż worker będzie wolny, i wywołuje Twoją funkcję z nim. Wyślij mu pracę przezworker.postMessage(value), odczytaj odpowiedź przezworker.once('message', fn)i wywołajrelease(), gdy skończysz: worker wraca do puli, a przejmuje go następne oczekujące zadanie.- Bez funkcji
pool.exec()zwraca obietnicę, która rozwiązuje się zworker(a worker maworker.release()), więc działa zawait. - Zadania są obsługiwane w kolejności, w jakiej o niego poprosiły. Pula nie kolejkuje wiadomości workera: w danym momencie ma go jedno zadanie.
- Pula jest też przechowywana w
F.workers[name].pool.workersto lista workerów.
Plik workera jest taki sam jak dla NEWTHREAD(): NEWTHREAD() w jego wnętrzu zwraca uchwyt z worker.message i worker.postMessage(). Tutaj każdy worker sumuje liczby i mówi, który wątek to zrobił.
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 });
}