JavaScript'te Paylaşılan Belleğe Giriş
Paylaşılan hafıza JavaScript'in gelişmiş bir özelliği olup, iş parçacığı (bir işlemin eşzamanlı olarak yürütülen bölümleri) kaldıraç yapabilir. Hafızaların paylaşılması iş parçacığı arasında güncellenmiş veriyi geçme zorluğu ve tüm başlıklar paylaşılan hafızada aynı verilere erişebilir ve bunları güncelleyebilir..
Bu kulağa hoş gelmiyor mu? Neredeyse. Bu yayında göreceğiz JavaScript’te paylaşılan hafızanın nasıl kullanılacağı ve gerçekten yapmak istediğin şeyin bu olup olmadığına nasıl karar verileceği.
Paylaşılan hafızanın avantajları ve dezavantajları
Kullanırız web çalışanları için JavaScript'te konu yarat. Web İşçileri API'si, kullanılabilecek çalışan iş parçacıkları oluşturmamıza izin veriyor. arka planda kod yürütmek böylece ana iş parçacığı, UI olaylarını işleyerek ve kullanıcı arayüzünün donmamasını sağlayarak yürütülmesine devam etmekte özgürdür..
İşçi konuları ana iplik ve birbirleriyle eşzamanlı olarak çalıştırın. Bir görevin farklı bölümlerinin bu eşzamanlı olarak yürütülmesi zaman tasarrufu sağlar. Daha hızlı bitirirsiniz, ancak kendi problemleri de vardır..
Her iş parçacığından emin olma Gerekli kaynakları alır ve zamanında iletişim kurar. Bir talihsizliğin şaşırtıcı sonuçlara yol açabileceği başlı başına bir iştir. Ya da eğer bir konu veriyi değiştiriyor, diğeri onu okuyor aynı zamanda, sence diğer konu ne görecek? Güncellenen veya eski veriler?
Bununla birlikte, web çalışanlarının batırılması kolay değildir. Mesajları kullanarak iletişimleri sırasında, birbirlerine gönderdikleri veriler orijinal değil, kopya, yani yapmazlar pay Aynı veri. Onlar veri kopyalarını birbirine geçirmek ihtiyaç duyulduğunda.
Ancak paylaşım önemlidir ve birden fazla iş parçacığının aynı anda aynı verilere bakması ve bunları değiştirmesi gerekebilir. Yani, paylaşımı yasaklamak büyük bir hayır-hayır. İşte burası SharedArrayBuffer
nesne resme gelir. Bize izin verecek birden fazla iş parçacığı arasında ikili veri paylaşma.
SharedArrayBuffer
nesne
Verilerin kopyalarını dişler arasında geçirmek yerine, kopyalarını geçmek SharedArrayBuffer
nesne. bir SharedArrayBuffer
nesne verilerin kaydedildiği hafızaya.
Yani, ne zaman kopyalarını SharedArrayBuffer
dişler arasında geçirilir, onlar hepsi hala aynı hafızaya işaret edecek Orijinal verilerin kaydedildiği yer. Böylece iplikler aynı hafızadaki verileri görüntüleyin ve güncelleyin..
Web çalışanları olmadan paylaşılan hafıza
Bir web çalışanının paylaşılan hafızayı kullanmadan nasıl çalıştığını görmek için alt iş parçacığı oluştur ve ona bazı veriler iletmek.
index.html
dosya tutar ana senaryo içinde etiketi, aşağıda gördüğünüz gibi:
const w = yeni İşçi ('worker.js'); var n = 9; w.postMessage (n);
worker.js
dosya taşır çalışan komut dosyası:
onmessage = (e) => console.group ('[işçi]'); console.log ('Ana dizinden veri alındı:% i', e.data); console.groupEnd ();
Yukarıdaki kodu kullanarak aşağıdakileri elde ederiz: konsolda çıkış:
[işçi] Ana konudan alınan veriler: 9
Söz konusu gönderiyi web çalışanlarına yukarıdaki kod parçalarının tam açıklaması için okuyabilirsiniz.
Şimdilik, verilerin olduğunu unutmayın. dişler arasında ileri geri gönderildi kullanmak postMessage ()
yöntem. Veri diğer taraftan alınan mesaj
olay işleyicisi, etkinliğin değeri olarak veri
özellik.
Şimdi, eğer biz veriyi değiştir alıcı sonunda güncellenecek mi? Bakalım:
const w = yeni İşçi ('worker.js'); var n = 9; w.postMessage (n); n = 1;
Beklendiği gibi veri var değil güncellendi:
[işçi] Ana konudan alınan veriler: 9
Niçin öyle olsun ki? Onun Ana senaryodan işçiye gönderilen bir klon.
Web çalışanları ile paylaşılan hafıza
Şimdi yapacağız kullan SharedArrayBuffer
nesne Aynı örnekte. Yeni bir tane yaratabiliriz SharedArrayBuffer
örnek olarak kullanmak yeni
anahtar kelime. Yapıcı bir parametre alır; bir bayt cinsinden uzunluk değeri, arabellek boyutunu belirleme.
const w = yeni İşçi ('worker.js'); buff = yeni SharedArrayBuffer (1); var arr = yeni Int8Array (buff); / * ayar verileri * / arr [0] = 9; / * arabellek (kopya) işçisine * / w.postMessage (buff) gönderme;
Bir not SharedArrayBuffer
nesne sadece paylaşılan hafıza alanını temsil eder. için ikili verileri görme ve değiştirme, uygun bir veri yapısı kullanmamız gerekiyor ( TypedArray
veya bir Veri görünümü
nesne).
İçinde index.html
yukarıdaki dosya, yeni SharedArrayBuffer
yalnızca bir bayt uzunluğunda oluşturulur. O zaman yeni Int8Array
, hangisi TypedArray
nesneler için kullanılır veriyi “9” sağlanan bayt alanında.
onmessage = (e) => var arr = yeni Int8Array (e.data); console.group ([işçi] '); console.log ('Ana dizinden alınan veriler:% i', arr [0]); console.groupEnd ();
Int8Array
İşçide ayrıca tampondaki verileri görüntüle.
Konsolda beklenen değer görünüyor tam olarak istediğimiz şey işçi ipliğinden:
[işçi] Ana konudan alınan veriler: 9
Şimdi hadi ana konudaki verileri güncelle değişimin işçiye yansıdığını görmek için.
const w = yeni İşçi ('worker.js'), buff = yeni SharedArrayBuffer (1); var arr = yeni Int8Array (buff); / * ayar verileri * / arr [0] = 9; / * arabellek (kopya) işçisine * / w.postMessage (buff) gönderme; / * verilerin değiştirilmesi * / arr [0] = 1;
Ve aşağıda gördüğünüz gibi güncelleme İşçinin içine yansıtır!
[işçi] Ana iş parçacığından alınan veriler: 1
Ancak, ayrıca kod başka yollarla çalışması gerekiyor: işçi içindeki değer ilk önce değiştiğinde ayrıca güncellenmesi gerekiyor ana iplikten basıldığında.
Bu durumda kodumuz şöyle görünür:
onmessage = (e) => var arr = yeni Int8Array (e.data); console.group ([işçi] '); console.log ('Ana dizinden alınan veriler:% i', arr [0]); console.groupEnd (); / * verilerin değiştirilmesi * / arr [0] = 7; / * ana dizine gönderme * / postMessage (");
İşçilerdeki veriler değiştirildi ve bir Ana konuya boş bir mesaj gönderildi Tampondaki verilerin değiştirildiğini ve çıkacak ana iş parçacığına hazır olduğunu bildiren.
const w = yeni İşçi ('worker.js'), buff = yeni SharedArrayBuffer (1); var arr = yeni Int8Array (buff); / * ayar verileri * / arr [0] = 9; / * arabellek (kopya) işçisine * / w.postMessage (buff) gönderme; / * verilerin değiştirilmesi * / arr [0] = 1; / * işçi değiştikten sonra verileri yazdırma * / w.onmessage = (e) => console.group ('[main]'); console.log ('Çalışan iş parçacığından güncellendi verileri:% i', arr [0]); console.groupEnd ();
Ve bu da işe yarıyor! Tampondaki veriler, çalışan içindeki verilerle aynı.
[işçi] Ana iş parçacığından alınan veriler: 1 [ana] Çalışan iş parçacığından alınan veriler güncellendi: 7
Değer her iki durumda da güncellenmiş görünüyor; hem ana hem de çalışan iş parçacığı aynı verileri görüntülüyor ve değiştiriyor.
Son sözler
Daha önce de belirttiğim gibi, paylaşılan hafızayı JavaScript’te kullanmak olumsuz taraf değil. Bunu sağlamak için geliştiricilere kalmış yürütme sırası tahmin edildiği gibi gerçekleşir ve hiçbir iki konu aynı verileri almak için yarışmıyor çünkü kimse kupayı kimin alacağını bilmiyor.
Paylaşılan hafızayla daha fazla ilgileniyorsanız, cihazın belgelerine bakın. nükleer fizik
nesne. Atomics nesnesi bazı zorluklarda size yardımcı olabilir, paylaşılan hafızadan okuma / yazmanın öngörülemez doğasını azaltarak.