Κέλογλου Θεόδωρος
Μάιος 2017
H JavaScript, όντας single-threaded γλώσσα δεν υλοποιεί τις δομές του παράλληλου και του κατανεμημένου υπολογισμού όπως οι άλλες γλώσσες.
Στην JavaScript δεν υπάρχει η έννοια των threads. Δηλαδή, δεν μπορεί ο προγραμματιστής να δημιουργήσει νέα, ούτε να τα ελέγξει με οποιοδήποτε άμεσο τρόπο.
Οποιαδήποτε εργασία θα κάναμε σε άλλες γλώσσες χρησιμοποιώντας νέα threads, στη JavaScript την κάνουμε εκμεταλευόντας το ασύγχρονη φύση της και τις δομές που μας δίνει.
Παρά ταύτα, τα τελευταία χρόνια έχουν δημιουργηθεί οι WebWorkers, μία ιδέα πολύ κοντά στα γνωστά threads, που όμως πάλι δεν χρησιμοποιείται όπως αυτά.
Μια μικρή εισαγωγή για να μπορούμε να καταλάβουμε τη συνέχεια
var fruits = ['Apple', 'Banana'];
console.log(fruits.length);
// 2
var first = fruits[0];
// Apple
var last = fruits[fruits.length - 1];
// Banana
fruits.forEach(function(item, index, array) {
console.log(item, index);
});
// Apple 0
// Banana 1
// Add to the end of an Array
var newLength = fruits.push('Orange');
// ["Apple", "Banana", "Orange"]
var myCar = {};
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.year = 1969;
console.log(myCar);
// {
// make: 'Ford',
// model: 'Mustang',
// year: 1969
// }
myCar['make'] = 'Ford';
myCar['model'] = 'Mustang';
myCar['year'] = 1969;
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.year = 1969;
function* idMaker() {
var index = 0;
while(true)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...
function* fibonacci() {
var fn1 = 0;
var fn2 = 1;
while (true) {
var current = fn1;
fn1 = fn2;
fn2 = current + fn1;
var reset = yield current;
if (reset) {
fn1 = 0;
fn2 = 1;
}
}
}
var sequence = fibonacci();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
console.log(sequence.next().value); // 3
console.log(sequence.next(true).value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
Ο JavaScript compiler, για να τρέχει κώδικα με ασύγχρονο τρόπο χρησιμοποιεί μία εσωτερική δομή δεδομένων, το λεγόμενο event loop.
console.log('this is the start');
setTimeout(function cb() {
console.log('this is a msg from call back');
});
console.log('this is just a message');
setTimeout(function cb1() {
console.log('this is a msg from call back1');
}, 0);
console.log('this is the end');
// "this is the start"
// "this is just a message"
// "this is the end"
// "this is a msg from call back"
// "this is a msg from call back1"
// main.js
var myWorker = new Worker('worker-calc-pi.js');
name.onchange = function() {
myWorker.postMessage([name.value,age.value]);
console.log('Message posted to worker');
}
age.onchange = function() {
myWorker.postMessage([name.value,age.value]);
console.log('Message posted to worker');
}
myWorker.onmessage = function(e) {
result.textContent = e.data;
console.log('Message received from worker');
}
// worker-calc-pi.js
onmessage = function(e) {
console.log('Message received from main script');
var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
console.log('Posting message back to main script');
postMessage(workerResult);
}
// from the main script
// main.js
myWorker.terminate();
// or from the worker script
// worker-calc-pi.js
close();