• Web Locks API एक टैब या web worker में asynchronous तरीके से lock हासिल करने, काम पूरा करने और फिर lock रिलीज़ करने की सुविधा देता है
  • जब तक lock बना रहता है, उसी origin के भीतर अन्य scripts वही lock हासिल नहीं कर सकतीं, इसलिए कई tabs या workers के बीच resources को सुरक्षित रूप से coordinate किया जा सकता है
  • यह केवल Secure Context(HTTPS) में उपलब्ध है और Web Workers में भी इस्तेमाल किया जा सकता है

मुख्य अवधारणाएँ और उपयोग का तरीका

  • Lock वेब application में परिभाषित किसी नाम से पहचाना जाने वाला एक abstract resource है
  • उदाहरण के लिए, कई tabs में IndexedDB और network sync करते समय, my_net_db_sync नाम का lock इस्तेमाल करके एक समय में केवल एक tab को sync चलाने दिया जा सकता है
  • उपयोग का flow:
    1. lock का अनुरोध
    2. asynchronous काम करना
    3. काम पूरा होने पर lock अपने-आप रिलीज़ हो जाता है

उदाहरण कोड

navigator.locks.request("my_resource", async (lock) => {
await do_something();
await do_something_else();
});

  • जब तक lock होल्ड किया जाता है, उसी lock के लिए आने वाले अन्य requests queue में जुड़ते हैं, और lock रिलीज़ होने पर पहला request प्रोसेस किया जाता है

विकल्प

  • mode: default mode exclusive (एकल) है, shared (साझा) mode भी उपलब्ध है। exclusive में केवल एक request की अनुमति होती है, जबकि shared में कई requests संभव हैं
  • ifAvailable: यदि lock तुरंत हासिल नहीं किया जा सकता, तो request विफल हो जाता है और callback null लौटाता है
  • steal: उसी नाम के मौजूदा lock को रिलीज़ करके नए request को प्राथमिकता से प्रोसेस करता है
  • signal: AbortSignal के जरिए request को रद्द किया जा सकता है (जैसे timeout लागू करने के लिए)

मॉनिटरिंग

  • navigator.locks.query() का उपयोग करके मौजूदा origin की lock स्थिति देखी जा सकती है
  • यह debugging के दौरान उपयोगी है, और इससे पता लगाया जा सकता है कि कौन-से locks होल्ड हैं और कौन-से locks अनुरोध किए गए हैं

उन्नत उपयोग

  • asynchronous काम की completion को स्पष्ट रूप से नियंत्रित करने के लिए Promise लौटाया जा सकता है

let resolve;
const p = new Promise((res) => { resolve = res });

navigator.locks.request("my_resource", (lock) => p);

  • resolve() कॉल होने पर lock रिलीज़ हो जाता है

Deadlock से बचाव

  • Deadlock वह स्थिति है जिसमें अलग-अलग requests क्रम की समस्या के कारण टकरा जाते हैं और आगे बढ़ना संभव नहीं रहता
  • उदाहरण के लिए, यदि tab 1 के पास lock A है और tab 2 के पास lock B है, फिर tab 1 lock B मांगे और tab 2 lock A मांगे, तो दोनों एक-दूसरे का इंतज़ार करते रहेंगे
  • इससे बचने के लिए:
  • lock requests को nested न करें
  • lock requests को निश्चित क्रम में चलाएँ
  • timeout सेट करके request रद्द करें

इंटरफेस

  • Lock: अनुरोधित lock का नाम और mode प्रदान करता है
  • LockManager: नया lock अनुरोध करने या मौजूदा locks देखने के लिए methods प्रदान करता है
  • navigator.locks से instance प्राप्त किया जा सकता है
  • WorkerNavigator.locks को Web Workers में इस्तेमाल किया जा सकता है

स्पेक और ब्राउज़र समर्थन

  • स्पेक: Web Locks API
  • ब्राउज़र compatibility: यह केवल कुछ browsers में समर्थित है; नवीनतम browser support की जानकारी MDN पर देखी जा सकती है

GN⁺ की राय

  • Web Locks API asynchronous environment में resource synchronization की समस्या सुलझाने में उपयोगी है
  • क्योंकि Deadlock हो सकता है, इसलिए इसका उपयोग सावधानी से करना चाहिए और timeout जैसी safety mechanisms पर विचार करना चाहिए
  • Shared mode read-only workloads में performance बढ़ा सकता है, लेकिन फिर भी race conditions की गहन समीक्षा ज़रूरी है
  • यह API localStorage या IndexedDB की synchronization issues के समाधान के लिए एक वैकल्पिक तरीका बन सकता है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.