ForgeTotal.js 5
el

Total.js 5

Εκτέλεση βαριάς εργασίας σε νήμα ή θυγατρική διεργασία

Total.js 5 · total5@0.0.19 workerthreadperformance Εκτελέστηκε με το Total.js 5

Το Node.js εκτελεί τον κώδικά σας σε ένα νήμα, οπότε ένας μακρύς υπολογισμός μπλοκάρει κάθε αίτημα. Το NEWTHREAD(name, data) ξεκινά το workers/<name>.js σε ένα νήμα worker και επιστρέφει ένα τυπικό Worker του Node.js: στείλτε του μηνύματα με το worker.postMessage(value), λάβετε απαντήσεις με το worker.on('message', fn) και σταματήστε το με το worker.kill(). Το δεύτερο όρισμα (data) παραδίδεται στον worker ως αρχικά δεδομένα. Το NEWFORK(name) έχει την ίδια μορφή αλλά ξεκινά μια ξεχωριστή θυγατρική διεργασία, απομονωμένη από την κύρια (μια κατάρρευσή της δεν επηρεάζει την εφαρμογή σας).

Μέσα στο αρχείο του worker, το NEWTHREAD() χωρίς ορίσματα επιστρέφει τη λαβή του worker: το worker.data περιέχει τα αρχικά δεδομένα, το worker.message = fn λαμβάνει μηνύματα και το worker.postMessage(value) απαντά. Περάστε ένα όνομα με πρόθεμα ~ για να χρησιμοποιήσετε ένα αρχείο με τη διαδρομή του αντί για το 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 });
}