Δομές Παράλληλου και Κατανεμημένου Υπολογισμού στη JavaScript
Κέλογλου Θεόδωρος
Μάιος 2017
JavaScript Features
- Dynamic
- Untyped
- Interpreted
- First class functions
- Single threaded
- Event-driven
JavaScript Threads?
H JavaScript, όντας single-threaded γλώσσα δεν υλοποιεί τις δομές του παράλληλου και του κατανεμημένου υπολογισμού όπως οι άλλες γλώσσες.
JavaScript Threads?
Στην JavaScript δεν υπάρχει η έννοια των threads. Δηλαδή, δεν μπορεί ο προγραμματιστής να δημιουργήσει νέα, ούτε να τα ελέγξει με οποιοδήποτε άμεσο τρόπο.
JavaScript is Asynchronous
Οποιαδήποτε εργασία θα κάναμε σε άλλες γλώσσες χρησιμοποιώντας νέα threads, στη JavaScript την κάνουμε εκμεταλευόντας το ασύγχρονη φύση της και τις δομές που μας δίνει.
JavaScript and Web Workers
Παρά ταύτα, τα τελευταία χρόνια έχουν δημιουργηθεί οι WebWorkers, μία ιδέα πολύ κοντά στα γνωστά threads, που όμως πάλι δεν χρησιμοποιείται όπως αυτά.
JavaScript Data Structures
- Arrays
- Objects
Μια μικρή εισαγωγή για να μπορούμε να καταλάβουμε τη συνέχεια
Primitive Data Types
- Number
- String
- Boolean
- Null
- Undefined
- Symbol (as of ECMAScript 6)
Arrays
var fruits = ['Apple', 'Banana'];
console.log(fruits.length);
// 2
var first = fruits[0];
// Apple
var last = fruits[fruits.length - 1];
// Banana
Array Loops
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"]
Objects
var myCar = {};
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.year = 1969;
console.log(myCar);
// {
// make: 'Ford',
// model: 'Mustang',
// year: 1969
// }
Objects
myCar['make'] = 'Ford';
myCar['model'] = 'Mustang';
myCar['year'] = 1969;
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.year = 1969;
Generators
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
// ...
Generators
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
Event Loop
Ο JavaScript compiler, για να τρέχει κώδικα με ασύγχρονο τρόπο χρησιμοποιεί μία εσωτερική δομή δεδομένων, το λεγόμενο event loop.
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"
Workers
// 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');
}
Workers
// 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);
}
Terminate a Worker
// from the main script
// main.js
myWorker.terminate();
// or from the worker script
// worker-calc-pi.js
close();
Δομές Παράλληλου και Κατανεμημένου Υπολογισμού στη JavaScript
By sirodoht
Δομές Παράλληλου και Κατανεμημένου Υπολογισμού στη JavaScript
- 355