API κλειδώματος ιστού

Συντονίστε την εργασία και τη χρήση πόρων μεταξύ διαφορετικών διαδικασιών

Ώρα να κλειδώσετε

Οι ασύγχρονες συναρτήσεις στο Javascript δεν είναι πραγματικά παράλληλες. Ξεκινώντας με το ES2017, το Javascript έχει υποστήριξη για ταυτόχρονες κλήσεις λειτουργιών. Η διαφορά συνοψίζεται πολύ καλά από τον Madhavan Nagarajan στην ακόλουθη δήλωση (ο σύνδεσμος μπορεί να βρεθεί στο προσάρτημα).

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

Η εφαρμογή της ταυτόχρονης Javascript μειώνεται στη λειτουργικότητά της, επιτρέποντας τη χρήση ενός απλού και πολύ ισχυρού API. Οι λειτουργίες Async δεν μπορούν να διακοπούν και δεν έχουν καμία έννοια των πτητικών ιδιοτήτων όταν ασχολούνται με την πρόσβαση στην ίδια μεταβλητή με διαφορετικές ασύγχρονες κλήσεις. Η λεπτομερής εφαρμογή των λειτουργιών async του ES2017 είναι εκτός πεδίου για αυτό το άρθρο, αλλά το κύριο σημείο που θέλω να ξεπεράσω είναι ότι μέχρι τώρα, ο παραλληλισμός δεν είχε ενσωματωθεί στο Javascript και στον Ιστό και ως εκ τούτου, δεν υπάρχει ειδικός χειρισμός παράλληλων μεταλλάξεων του ίδια οντότητα. Αλλά αυτό αλλάζει τώρα με την εισαγωγή του "Web Locks API".

Ενας για όλους και όλοι για έναν

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

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

Ένας πόρος είναι απλώς ένας χώρος ονομάτων, που προσδιορίζεται από μια συμβολοσειρά. Και το αίτημά σας για πρόσβαση στον πόρο είναι εξίσου απλό, καθώς χρειάζεστε μόνο το αναγνωριστικό και μια συνάρτηση επανάκλησης, πιθανότατα ασύγχρονη, για να εφαρμόσετε το "Web Lock API". Όταν ολοκληρωθεί μια λειτουργία async, το κλείδωμα απελευθερώνεται και άλλα αιτήματα μπορούν να έχουν ξανά πρόσβαση σε αυτό.

/*
 * A simple demonstration of the Web Lock API.
 * Note that this example has been taken from
 * MDN's awesome documentation, linked in the
 * addendum.
 */
async function foo(){
  // A common async function that you already know.
  const data = await getData();

  // Request the lock.
  // Note that we can simply await the locked call!
  await navigator.locks.request('lock_resource_id', async lock => {
    // The lock has been acquired.
    // At this point, this call has exlusive access 
    // to the resource 'lock_resource_id'.
    await updateDb(data);
    // Now the lock will be released.
  });
  
  // The lock has been released.
  // Continuse with plain async calls.
  await updateUi();
}

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

/**
 * Due to the usage of web locks in core parts
 * of your app, actually using the API this way
 * might introduce more problems then it could solve.
 * 
 * Therefore a thorough specification in your app
 * has to be implementation before using this feature.
 */
async function update(){
  if(navigator?.locks){
    // Run logic with lock.
  } else {
    // Use fallback.
  }
}

Για την καλύτερη απεικόνιση αυτού του νέου API, θα ρίξουμε μια ματιά σε ένα απλό παράδειγμα. Ας υποθέσουμε ότι διαθέτετε PWA πολλαπλών νημάτων με την κύρια διαδικασία και δύο WebWorkers. Η εφαρμογή σας χρησιμοποιεί επίσης IndexDB, με προσαρμοσμένο κώδικα που συγχρονίζει αλλαγές από και προς τη βάση δεδομένων με το σύννεφο. Χρησιμοποιώντας το "Web Lock API" σε αυτό το σενάριο, κάθε διαδικασία μπορεί να ζητήσει πρόσβαση στο καθορισμένο κλείδωμα για συγχρονισμό αλλαγών στη βάση δεδομένων, διασφαλίζοντας ότι δεν εκτελούνται άλλες μεταλλάξεις κατά τη διάρκεια αυτής της κλήσης.

Λάβετε υπόψη ότι το "Web Lock API" δεν αφορά τόσο τη μετάλλαξη μιας μεταβλητής χωρίς παρενέργειες στην εφαρμογή ιστού σας (αν και αυτό μπορεί σαφώς να είναι περίπτωση χρήσης), αλλά περισσότερα σχετικά με το χειρισμό λειτουργιών σε παράλληλη αρχιτεκτονική που διαφορετικά αρνητικές παρενέργειες

Πολύ περισσότερα να μάθεις

Αυτό το άρθρο έδωσε μια εισαγωγή μόνο στο νέο "Web Locks API", το οποίο βρίσκεται σε πειραματική κατάσταση και υποστηρίζεται κυρίως από προγράμματα περιήγησης που βασίζονται στο Chromium. Το API προσφέρει περισσότερες επιλογές που περιγράφουν εδώ και αξίζει να το εξετάσετε.

Προτάσεις

Σχετικά

Προσάρτημα

Γλώσσες