Οι προγραμματιστές JavaScript έχουν συνηθίσει να προσποιούνται τον παραλληλισμό, αλλά υπάρχει ένας τρόπος για να επιτύχετε αληθινό παραλληλισμό που θα πρέπει να χρησιμοποιείτε αυτήν τη στιγμή.

Η JavaScript μπορεί να αντιμετωπίσει εργασίες με ένταση απόδοσης επειδή είναι μια γλώσσα με ένα νήμα. Χρησιμοποιώντας τον παραλληλισμό, μπορείτε να επιτύχετε εκτέλεση πολλαπλών νημάτων σε JavaScript και να βελτιώσετε την απόδοση και την ανταπόκριση των σύγχρονων εφαρμογών ιστού σας.

Παραλληλισμός στον προγραμματισμό JavaScript

Ο παραλληλισμός είναι ζωτικής σημασίας στους σύγχρονους υπολογιστές για τη βελτίωση της απόδοσης και της επεκτασιμότητας. Αυτό το επιτυγχάνει χρησιμοποιώντας αποτελεσματικά τους διαθέσιμους πόρους.

Μια κοινή τεχνική που χρησιμοποιείται για την επίτευξη παραλληλισμού στον προγραμματισμό είναι το multi-threading. Το νήμα JavaScript, ωστόσο, είναι ένα σύστημα μονού νήματος και μπορεί να χειριστεί μόνο μία εργασία τη φορά. Αυτό σημαίνει ότι δεν είναι εξοικειωμένο με τις παράλληλες εκτελέσεις προγραμμάτων.

instagram viewer

Παράλληλος προγραμματισμός Fakes JavaScript

Μια κοινή παρανόηση σχετικά με τον παραλληλισμό είναι ότι μπορείτε να τον πετύχετε χρησιμοποιώντας τεχνικές ασύγχρονου προγραμματισμού όπως ασυγχρονισμός/αναμονή, επιστροφές κλήσεων και υποσχέσεις:

// Συνάρτηση Async/wait που προσομοιώνει ένα αίτημα δικτύου
ασυγχρονισμόςλειτουργίαfetchData() {
συνθ ανταπόκριση = αναμένω φέρω();
συνθ δεδομένα = αναμένω answer.json();
ΕΠΙΣΤΡΟΦΗ δεδομένα;
}

// Συνάρτηση επανάκλησης που καταγράφει τα δεδομένα που λαμβάνονται στην κονσόλα
λειτουργίαlogData(δεδομένα) {
κονσόλα.log (δεδομένα);
}

// Μέθοδος Promise.all() που εκτελεί πολλές υποσχέσεις παράλληλα
Υπόσχεση.όλα([
fetchData(),
fetchData(),
]).έπειτα((Αποτελέσματα) => {
κονσόλα.log (αποτελέσματα);
});

// Καλέστε τη συνάρτηση fetchData και μεταβιβάστε τη συνάρτηση logData ως επιστροφή κλήσης
fetchData().then (logData);

Αυτές οι τεχνικές στην πραγματικότητα δεν εκτελούν κώδικα παράλληλα. Η JavaScript χρησιμοποιεί τον βρόχο συμβάντων για να μιμηθεί τον παράλληλο προγραμματισμό στο σχεδιασμό ενός νήματος.

Ο βρόχος συμβάντος είναι ένα θεμελιώδες μέρος του περιβάλλοντος χρόνου εκτέλεσης JavaScript. Σας επιτρέπει να εκτελείτε ασύγχρονες λειτουργίες, όπως αιτήματα δικτύου, στο παρασκήνιο χωρίς να μπλοκάρετε το κύριο μεμονωμένο νήμα.

Ο βρόχος συμβάντων ελέγχει συνεχώς για νέα συμβάντα ή εργασίες σε μια ουρά και τα εκτελεί ένα προς ένα διαδοχικά. Αυτή η τεχνική επιτρέπει στο JavaScript να επιτύχει ταυτόχρονο και θεωρητικό παραλληλισμό.

Συγχρονισμός vs. Παραλληλισμός

Η ταυτοποίηση και ο παραλληλισμός συχνά παρεξηγούνται και ανταλλάσσονται στον κόσμο της JavaScript.

Το Concurrency στο JavaScript αναφέρεται στη δυνατότητα εκτέλεσης πολλαπλών εργασιών επικαλύπτοντας την εκτέλεση των εργασιών. Όπου μια εργασία μπορεί να ξεκινήσει πριν ολοκληρωθεί μια άλλη, αλλά οι εργασίες δεν μπορούν ούτε να ξεκινήσουν ούτε να τελειώσουν ταυτόχρονα. Αυτό επιτρέπει στην JavaScript να χειρίζεται αποτελεσματικά τις λειτουργίες, όπως η ανάκτηση δεδομένων από ένα REST API ή ανάγνωση αρχείων, χωρίς αποκλεισμό του κύριου νήματος εκτέλεσης.

Ο παραλληλισμός, από την άλλη πλευρά, αναφέρεται στην ικανότητα εκτέλεσης πολλαπλών εργασιών ταυτόχρονα σε πολλαπλά νήματα. Αυτά τα νήματα φόντου μπορούν να εκτελέσουν εργασίες ανεξάρτητα και ταυτόχρονα. Αυτό ανοίγει ευκαιρίες για την επίτευξη αληθινού παραλληλισμού στις εφαρμογές JavaScript.

Οι εφαρμογές της JavaScript μπορούν να επιτύχουν αληθινό παραλληλισμό μέσω τη χρήση των Web Workers.

Οι Εργάτες Ιστού εισάγουν τον Παραλληλισμό στην JavaScript

Τα Web Workers είναι ένα χαρακτηριστικό των σύγχρονων προγραμμάτων περιήγησης ιστού που επιτρέπουν στον κώδικα JavaScript να εκτελείται σε νήματα φόντου, ξεχωριστά από το κύριο νήμα εκτέλεσης. Σε αντίθεση με το κύριο νήμα, το οποίο χειρίζεται τις αλληλεπιδράσεις των χρηστών και τις ενημερώσεις διεπαφής χρήστη. Το Web Worker θα είναι αφοσιωμένο στην εκτέλεση εργασιών με υπολογιστική ένταση.

Παρακάτω είναι μια αναπαράσταση διαγράμματος της λειτουργίας ενός Web Worker σε JavaScript.

Το κύριο νήμα και το Web Worker μπορούν να επικοινωνούν χρησιμοποιώντας τη μετάδοση μηνυμάτων. Χρησιμοποιώντας την postΜήνυμα μέθοδο αποστολής μηνυμάτων και το ένα μήνυμα πρόγραμμα χειρισμού συμβάντων για να λαμβάνετε μηνύματα, μπορείτε να μεταβιβάζετε οδηγίες ή δεδομένα εμπρός και πίσω.

Δημιουργία Web Worker

Για να δημιουργήσετε ένα Web Worker, πρέπει να δημιουργήσετε ένα ξεχωριστό αρχείο JavaScript.

Εδώ είναι ένα παράδειγμα:

// main.js

// Δημιουργία νέου Web Worker
συνθ εργάτης = νέος Εργάτης("worker.js");

// Στείλτε ένα μήνυμα στο Web Worker
worker.postMessage('Γεια από το κύριο νήμα!');

// Ακρόαση μηνυμάτων από το Web Worker
εργάτης.onmessage = λειτουργία(Εκδήλωση) {
κονσόλα.κούτσουρο('Λήφθηκε μήνυμα από το Web Worker:', event.data);
};

Το παραπάνω παράδειγμα δημιουργεί ένα νέο Web Worker περνώντας τη διαδρομή προς το σενάριο εργασίας (εργάτης.js) ως επιχείρημα στο Εργάτης κατασκευαστής. Μπορείτε να στείλετε ένα μήνυμα στον Web Worker χρησιμοποιώντας το postΜήνυμα μέθοδο και ακούστε μηνύματα από το Web Worker χρησιμοποιώντας το ένα μήνυμα χειριστής συμβάντων.

Στη συνέχεια, θα πρέπει να δημιουργήσετε το σενάριο εργασίας (εργάτης.js) αρχείο:

// worker.js

// Ακρόαση μηνυμάτων από το κύριο νήμα
εαυτός.onmessage = λειτουργία(Εκδήλωση) {
κονσόλα.κούτσουρο('Λήφθηκε μήνυμα από το κύριο νήμα:', event.data);

// Στείλτε ένα μήνυμα πίσω στο κύριο νήμα
self.postMessage("Γεια από το worker.js!");
};

Το σενάριο Web Worker ακούει μηνύματα από το κύριο νήμα χρησιμοποιώντας το ένα μήνυμα χειριστής συμβάντων. Μόλις λάβετε ένα μήνυμα, αποσυνδέεστε το μήνυμα μέσα γεγονός.δεδομένα και στείλτε ένα νέο μήνυμα στο κύριο νήμα με το postΜήνυμα μέθοδος.

Αξιοποίηση του Παραλληλισμού με τους Εργάτες Ιστού

Η κύρια περίπτωση χρήσης για τους Εργάτες Ιστού είναι η παράλληλη εκτέλεση εργασιών JavaScript με υπολογιστική ένταση. Με τη μεταφόρτωση αυτών των εργασιών σε Web Workers, μπορείτε να επιτύχετε σημαντικές βελτιώσεις απόδοσης.

Ακολουθεί ένα παράδειγμα χρήσης ενός web worker για να εκτελέσετε έναν βαρύ υπολογισμό:

// main.js

συνθ εργάτης = νέος Εργάτης("worker.js");

// Αποστολή δεδομένων στο Web Worker για υπολογισμό
worker.postMessage([1, 2, 3, 4, 5]);

// Ακούστε το αποτέλεσμα από το Web Worker
εργάτης.onmessage = λειτουργία(Εκδήλωση) {
συνθ αποτέλεσμα = συμβάν.δεδομένα;
κονσόλα.κούτσουρο('Αποτέλεσμα υπολογισμού:', αποτέλεσμα)·
};

Worker.js:

// Ακρόαση δεδομένων από το κύριο νήμα
εαυτός.onmessage = λειτουργία (Εκδήλωση) {
συνθ αριθμοί = συμβάν.δεδομένα;

συνθ αποτέλεσμα = performHeavyCalculation (αριθμοί);

// Στείλτε το αποτέλεσμα πίσω στο κύριο νήμα
self.postMessage (αποτέλεσμα);
};

λειτουργίαperformHeavyCalculation(δεδομένα) {
// Εκτελέστε έναν σύνθετο υπολογισμό στον πίνακα των αριθμών
ΕΠΙΣΤΡΟΦΗ δεδομένα
.χάρτης((αριθμός) =>Μαθηματικά.pow (αριθμός, 3)) // Κύβος κάθε αριθμού
.φίλτρο((αριθμός) => αριθμός % 20) // Φιλτράρισμα ζυγών αριθμών
.περιορίζω((άθροισμα, αριθμός) => άθροισμα + αριθμός, 0); // Άθροισμα όλων των αριθμών
}

Σε αυτό το παράδειγμα, μεταβιβάζετε έναν πίνακα αριθμών από το κύριο νήμα στο Web Worker. Το Web Worker εκτελεί τον υπολογισμό χρησιμοποιώντας τον παρεχόμενο πίνακα δεδομένων και στέλνει το αποτέλεσμα πίσω στο κύριο νήμα. ο performHeavyCalculation() Η συνάρτηση αντιστοιχίζει κάθε αριθμό στον κύβο του, φιλτράρει τους ζυγούς αριθμούς και τέλος τους αθροίζει.

Περιορισμοί και Θεωρήσεις

Ενώ οι Εργάτες Ιστού παρέχουν έναν μηχανισμό για την επίτευξη παραλληλισμού στο JavaScript, είναι σημαντικό να λάβετε υπόψη ορισμένους περιορισμούς και εκτιμήσεις:

  • Χωρίς κοινόχρηστη μνήμη: Οι Εργάτες Ιστού λειτουργούν σε ξεχωριστά νήματα και δεν μοιράζονται τη μνήμη με το κύριο νήμα. Έτσι, δεν μπορούν να έχουν άμεση πρόσβαση σε μεταβλητές ή αντικείμενα από το κύριο νήμα χωρίς να περάσει μήνυμα.
  • Serialization και Deserialization: Κατά τη διαβίβαση δεδομένων μεταξύ του κύριου νήματος και των Εργατών Ιστού, πρέπει να σειριοποιήσετε και να αποσειροποιήσετε τα δεδομένα, καθώς η μετάδοση μηνυμάτων είναι μια επικοινωνία που βασίζεται σε κείμενο. Αυτή η διαδικασία συνεπάγεται κόστος απόδοσης και μπορεί να επηρεάσει τη συνολική απόδοση της εφαρμογής.
  • Υποστήριξη προγράμματος περιήγησης: Αν και τα Web Workers υποστηρίζονται καλά στα περισσότερα σύγχρονα προγράμματα περιήγησης ιστού, ορισμένα παλαιότερα προγράμματα περιήγησης ή περιορισμένα περιβάλλοντα ενδέχεται να έχουν μερική ή καθόλου υποστήριξη για Web Workers.

Επίτευξη πραγματικού παραλληλισμού σε JavaScript

Ο παραλληλισμός στο JavaScript είναι μια συναρπαστική έννοια που επιτρέπει την αληθινή ταυτόχρονη εκτέλεση εργασιών, ακόμη και σε μια κυρίως γλώσσα μονού νήματος. Με την εισαγωγή των Web Workers, μπορείτε να αξιοποιήσετε τη δύναμη του παραλληλισμού και να επιτύχετε σημαντικές βελτιώσεις απόδοσης στις εφαρμογές σας JavaScript.