लॉक इन करने का समय
जावास्क्रिप्ट में अतुल्यकालिक कार्य वास्तव में समानांतर नहीं हैं। ES2017 से शुरू होकर, Javascript को समवर्ती फ़ंक्शन कॉल के लिए समर्थन प्राप्त है। निम्नलिखित कथन में माधवन नागराजन द्वारा अंतर को बहुत अच्छी तरह से अभिव्यक्त किया गया है (लिंक परिशिष्ट में पाया जा सकता है)।
Concurrency एक साथ बहुत सी चीजों से निपटने के बारे में है। समानांतरवाद एक साथ बहुत सी चीजें करने के बारे में है।
एक सरल और बहुत मजबूत एपीआई का उपयोग करने की अनुमति देने के लिए जावास्क्रिप्ट की समरूपता का कार्यान्वयन इसकी कार्यक्षमता में कम हो गया है। अलग-अलग एसिंक्रोनस कॉल द्वारा एक ही चर तक पहुंच से निपटने के दौरान Async फ़ंक्शन को बाधित नहीं किया जा सकता है और अस्थिर गुणों की कोई अवधारणा नहीं है। ES2017 के async फ़ंक्शंस का विस्तृत कार्यान्वयन इस लेख के दायरे से बाहर है, लेकिन मुख्य बिंदु जो मैं पार करना चाहता हूं, वह यह है कि अब तक, समांतरता को जावास्क्रिप्ट और वेब में नहीं बनाया गया था और इसलिए, समानांतर उत्परिवर्तन का कोई विशेष संचालन नहीं किया गया था। एक ही इकाई। लेकिन यह अब "वेब लॉक्स एपीआई" की शुरुआत के साथ बदल गया है।
एक के लिए सभी और सभी के लिए एक
अब जबकि प्रगतिशील वेब ऐप्स आपको WebWorkers और ServiceWorker की शुरुआत के साथ वास्तविक बहु-थ्रेडेड आर्किटेक्चर प्रदान करते हैं, चीजें बदल गई हैं। वेब ऐप्स में सही समानता संभव है, और इसलिए समानांतर कोड से निपटने के लिए अधिक परिष्कृत टूल की इच्छा पैदा होती है।
ताला संसाधनों तक पहुंच का अनुरोध करने के लिए एक तंत्र है और गारंटी है कि किसी भी समय केवल एक प्रक्रिया में वास्तव में पहुंच है। इस तरह से संसाधनों को लॉक करना संघर्ष क्षेत्रों के एक बड़े समूह से बचा जाता है जो अन्य उत्पन्न हो सकते हैं।
एक संसाधन सिर्फ एक नाम स्थान है, जिसे एक स्ट्रिंग द्वारा पहचाना जाता है। और संसाधन तक पहुंचने का आपका अनुरोध उतना ही सरल है, जितना कि आपको "वेब लॉक एपीआई" को लागू करने के लिए केवल आईडी और फ़ंक्शन कॉलबैक की आवश्यकता होती है, सबसे अधिक संभावना अतुल्यकालिक। जब एक एसिंक फ़ंक्शन समाप्त हो जाता है तो लॉक जारी हो जाता है और अन्य अनुरोध इसे फिर से एक्सेस कर सकते हैं।
/*
* 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();
}
इस नए एपीआई की प्रयोगात्मक स्थिति के कारण, आपको इसे अपने कोड में एक वैकल्पिक सुविधा के रूप में मान्य फ़ॉलबैक उपलब्ध के साथ मानना होगा।
/**
* 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.
}
}
इस नए एपीआई को बेहतर ढंग से समझाने के लिए, हम एक साधारण उदाहरण पर एक नज़र डालेंगे। मान लें कि आपके पास अपनी मुख्य प्रक्रिया और दो वेबवर्कर्स के साथ एक बहुप्रचारित PWA है। आपका ऐप कस्टम कोड के साथ एक इंडेक्सडीबी का भी उपयोग करता है जो क्लाउड के साथ डेटाबेस से और उसके परिवर्तनों को सिंक करता है। इस परिदृश्य में "वेब लॉक एपीआई" का उपयोग करते हुए, प्रत्येक प्रक्रिया डेटाबेस में परिवर्तनों को समन्वयित करने के लिए परिभाषित लॉक तक पहुंच का अनुरोध कर सकती है, यह सुनिश्चित करते हुए कि इस कॉल के दौरान कोई अन्य उत्परिवर्तन नहीं चलता है।
ध्यान दें कि "वेब लॉक एपीआई" आपके वेब ऐप में साइड इफेक्ट के बिना एक चर को बदलने के बारे में इतना अधिक नहीं है (हालांकि यह स्पष्ट रूप से उपयोग का मामला हो सकता है), लेकिन समानांतर आर्किटेक्चर में फ़ंक्शन कॉल को संभालने के बारे में अधिक है जो अन्यथा नेतृत्व करेगा नकारात्मक दुष्प्रभाव।
सीखने के लिए और भी बहुत कुछ
इस लेख ने केवल नए "वेब लॉक्स एपीआई" का परिचय दिया, जो वर्तमान में प्रायोगिक स्थिति में है और मुख्य रूप से क्रोमियम-आधारित ब्राउज़र द्वारा समर्थित है। एपीआई अधिक विकल्प प्रदान करता है जो यहां वर्णन करता है और इसमें देखने लायक है।