ForgeTotal.js 5
pl

Total.js 5

Wykonuj ciężką pracę w wątku lub procesie potomnym

Total.js 5 · total5@0.0.19 workerthreadperformance Uruchomiono z Total.js 5

Node.js wykonuje Twój kod w jednym wątku, więc długie obliczenie blokuje wszystkie żądania. NEWTHREAD(name, data) uruchamia workers/<name>.js w wątku worker i zwraca standardowy Worker Node.js: wysyłaj mu wiadomości przez worker.postMessage(value), odbieraj odpowiedzi przez worker.on('message', fn) i zatrzymuj go przez worker.kill(). Drugi argument (data) jest przekazywany workerowi jako dane początkowe. NEWFORK(name) ma ten sam kształt, ale uruchamia osobny proces potomny, odizolowany od procesu głównego (jego awaria nie wpływa na Twoją aplikację).

Wewnątrz pliku workera NEWTHREAD() bez argumentów zwraca uchwyt workera: worker.data zawiera dane początkowe, worker.message = fn odbiera wiadomości, a worker.postMessage(value) odpowiada. Przekaż nazwę z prefiksem ~, aby użyć pliku podanego ścieżką zamiast workers/<name>.js.

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