Condividi pochi thread di lavoro con NEWTHREADPOOL()
NEWTHREAD() avvia un worker. Quando molte richieste hanno bisogno dello stesso lavoro pesante, un worker per richiesta sono troppi e un solo worker le fa aspettare l'una con l'altra senza alcun ordine. NEWTHREADPOOL(name, count, [isfork]) avvia count worker di workers/name.js (un thread; con isfork impostato su true un processo figlio, come NEWFORK()) e li distribuisce uno alla volta.
pool.exec(function(worker, release) {})aspetta che un worker sia libero e chiama la tua funzione con esso. Mandagli il lavoro conworker.postMessage(value), leggi la risposta conworker.once('message', fn)e chiamarelease()quando hai finito: il worker torna nel pool e lo prende il lavoro successivo in attesa.- Senza funzione,
pool.exec()restituisce una promise che si risolve conworker(e il worker haworker.release()), quindi funziona conawait. - I lavori sono serviti nell'ordine in cui hanno chiesto. Il pool non accoda i messaggi di un worker: un lavoro alla volta lo ha.
- Il pool è conservato anche in
F.workers[name].pool.workersè la lista dei worker.
Il file del worker è lo stesso di NEWTHREAD(): NEWTHREAD() al suo interno restituisce l'handle con worker.message e worker.postMessage(). Qui ogni worker somma i numeri e dice quale thread lo ha fatto.
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 });
}