Partager quelques threads de travail avec NEWTHREADPOOL()
NEWTHREAD() démarre un worker. Quand de nombreuses requêtes ont besoin du même travail lourd, un worker par requête est trop, et un seul worker les fait s'attendre sans aucun ordre. NEWTHREADPOOL(name, count, [isfork]) démarre count workers de workers/name.js (un thread ; avec isfork à true, un processus enfant, comme NEWFORK()) et les distribue un à la fois.
pool.exec(function(worker, release) {})attend qu'un worker soit libre et appelle votre fonction avec lui. Envoyez-lui le travail avecworker.postMessage(value), lisez la réponse avecworker.once('message', fn)et appelezrelease()quand vous avez terminé : le worker retourne dans le pool et la prochaine tâche en attente le prend.- Sans fonction,
pool.exec()renvoie une promesse qui se résout avecworker(et le worker aworker.release()), si bien qu'il fonctionne avecawait. - Les tâches sont servies dans l'ordre où elles l'ont demandé. Le pool ne met pas en file les messages d'un worker : une seule tâche à la fois l'a.
- Le pool est aussi conservé dans
F.workers[name].pool.workersest la liste des workers.
Le fichier du worker est le même que pour NEWTHREAD() : NEWTHREAD() à l'intérieur renvoie le handle avec worker.message et worker.postMessage(). Ici chaque worker additionne les nombres et dit quel thread l'a fait.
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 });
}