Kilitleme zamanı
Javascript'teki eşzamansız işlevler gerçekten paralel değildir. ES2017'den itibaren Javascript, eşzamanlı işlev çağrılarını destekler. Fark, Madhavan Nagarajan tarafından aşağıdaki açıklamada çok güzel bir şekilde özetlenmiştir (bağlantı ekte bulunabilir).
Eşzamanlılık, aynı anda birçok şeyle uğraşmakla ilgilidir. Paralellik, aynı anda birçok şey yapmakla ilgilidir.
Javascript'in eşzamanlılığının uygulanması, basit ve çok sağlam bir API'nin kullanılmasına izin vermek için işlevselliğinde azaltılmıştır. Farklı asenkron çağrılarla aynı değişkene erişim söz konusu olduğunda, zaman uyumsuz işlevler kesintiye uğratılamaz ve geçici özellikler kavramına sahip değildir. ES2017'nin zaman uyumsuz işlevlerinin ayrıntılı uygulaması bu makalenin kapsamı dışındadır, ancak değinmek istediğim ana nokta şu ana kadar Javascript ve web'de paralelliğin yerleşik olmadığı ve bu nedenle paralel mutasyonların özel bir şekilde ele alınmadığıdır. aynı varlık. Ancak bu, "Web Kilitleri API'sinin" tanıtılmasıyla şimdi değişiyor.
Birimiz hepimiz, hepimiz birimiz için
WebWorkers ve ServiceWorker'ın piyasaya sürülmesiyle birlikte aşamalı web uygulamaları size gerçek çok iş parçacıklı mimariler sunduğuna göre, işler değişti. Web uygulamalarında gerçek paralellik mümkündür ve bu nedenle paralel kodla başa çıkmak için daha karmaşık araçlara yönelik istek ortaya çıkar.
Kilit, kaynaklara erişim talep eden ve herhangi bir zamanda yalnızca bir işlemin gerçekten erişime sahip olduğunu garanti eden bir mekanizmadır. Kaynakları bu şekilde kilitlemek, başka türlü ortaya çıkabilecek çok sayıda çatışma alanını önler.
Kaynak, yalnızca bir dizeyle tanımlanan bir ad alanıdır. Ve kaynağa erişme isteğiniz de aynı derecede basittir, çünkü "Web Kilidi API'sini" uygulamak için yalnızca kimliğe ve büyük olasılıkla eşzamansız bir işlev geri çağrısına ihtiyacınız vardır. Bir zaman uyumsuz işlevi bittiğinde, kilit serbest bırakılır ve diğer istekler ona tekrar erişebilir.
/*
* 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();
}
Bu yeni API'nin deneysel durumu nedeniyle, bunu, geçerli bir geri dönüş ile kodunuzda isteğe bağlı bir özellik olarak ele almanız gerekir.
/**
* 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.
}
}
Bu yeni API'yi daha iyi göstermek için basit bir örneğe göz atacağız. Ana işleminiz ve iki WebWorker ile çok iş parçacıklı bir PWA'nız olduğunu varsayalım. Uygulamanız ayrıca, veritabanındaki ve veritabanındaki değişiklikleri bulutla eşitleyen özel koda sahip bir IndexDB kullanır. Bu senaryoda "Web Kilidi API'sini" kullanarak, her işlem, değişiklikleri veritabanına senkronize etmek için tanımlanan kilide erişim talep edebilir ve bu çağrı sırasında başka mutasyonların çalıştırılmadığından emin olur.
"Web Kilidi API'sinin", web uygulamanızda yan etkileri olmayan tek bir değişkeni mutasyona uğratmaktan çok (bu açıkça bir kullanım durumu olabilir), ancak daha çok, aksi takdirde yol açacak olan paralel bir mimaride işlev çağrılarını işlemekle ilgili olduğunu unutmayın olumsuz yan etkiler.
Daha öğrenecek çok şey var
Bu makale yalnızca şu anda deneysel durumda olan ve çoğunlukla Chromium tabanlı tarayıcılar tarafından desteklenen yeni "Web Kilitleri API'sine" bir giriş yaptı. API, burada açıklanan daha fazla seçenek sunar ve buna bir göz atmaya değer.