ForgeTotal.js 5
sv

Total.js 5

Dela några arbetstrådar med NEWTHREADPOOL()

Total.js 5 · total5@0.0.19 workerthreadpoolperformance Körd med Total.js 5

NEWTHREAD() startar en worker. När många förfrågningar behöver samma tunga jobb är en worker per förfrågan för många, och en enda worker får dem att vänta på varandra utan någon ordning. NEWTHREADPOOL(name, count, [isfork]) startar count workers från workers/name.js (en tråd; med isfork satt till true en barnprocess, som NEWFORK()) och delar ut dem en i taget.

  • pool.exec(function(worker, release) {}) väntar tills en worker är ledig och anropar din funktion med den. Skicka arbetet till den med worker.postMessage(value), läs svaret med worker.once('message', fn) och anropa release() när du är klar: workern går tillbaka till poolen och nästa väntande jobb tar den.
  • Utan funktion returnerar pool.exec() ett löfte som löses med worker (och workern har worker.release()), så det fungerar med await.
  • Jobben betjänas i den ordning de bad om det. Poolen köar inte en workers meddelanden: ett jobb i taget har den.
  • Poolen finns också i F.workers[name]. pool.workers är listan över workers.

Worker-filen är densamma som för NEWTHREAD(): NEWTHREAD() i den returnerar handtaget med worker.message och worker.postMessage(). Här summerar varje worker talen och säger vilken tråd som gjorde det.

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