ForgeTotal.js 5
hu

Total.js 5

Nehéz munka futtatása szálban vagy gyermekfolyamatban

Total.js 5 · total5@0.0.19 workerthreadperformance Total.js 5-tel lefuttatva

A Node.js a kódodat egyetlen szálon futtatja, ezért egy hosszú számítás minden kérést blokkol. A NEWTHREAD(name, data) a workers/<name>.js fájlt egy worker szálban indítja, és egy szokásos Node.js Workert ad vissza: küldj neki üzeneteket a worker.postMessage(value)-val, fogadd a válaszokat a worker.on('message', fn)-nel, és állítsd le a worker.kill()-lel. A második argumentum (data) kezdőadatként kerül a workerhez. A NEWFORK(name) ugyanilyen alakú, de külön gyermekfolyamatot indít, amely el van szigetelve a fő folyamattól (az összeomlása nem érinti az alkalmazásodat).

A worker fájljában az argumentum nélküli NEWTHREAD() a worker handle-t adja vissza: a worker.data a kezdőadatokat tartalmazza, a worker.message = fn fogadja az üzeneteket, a worker.postMessage(value) pedig válaszol. Adj meg ~ előtagú nevet, hogy a workers/<name>.js helyett útvonallal megadott fájlt használj.

workers/sum.js
require('total5');

const worker = NEWTHREAD();
const start = worker.data.start;

worker.message = function(message) {
	let total = start;
	for (let i = 1; i <= message.to; i++)
		total += i;
	worker.postMessage({ total: total });
};
controllers/sum.js
exports.install = function() {
	ROUTE('GET /sum/{to}/', sum);
};

var thread = NEWTHREAD('sum', { start: 1000 });

function sum($) {
	var to = +$.params.to;
	var timeout = setTimeout(() => $.invalid('timeout'), 4000);
	thread.once('message', function(response) {
		clearTimeout(timeout);
		$.json(response);
	});
	thread.postMessage({ to: to });
}