Δομές Παράλληλου και Κατανεμημένου Υπολογισμού στη 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