JavaScript programcıları sahte paralellik yapmaya alışkındır, ancak gerçek paralelliğe ulaşmanın şu anda kullanmanız gereken bir yolu var.
JavaScript, tek iş parçacıklı bir dil olduğu için yoğun performans gerektiren görevlerle mücadele edebilir. Paralelliği kullanarak, JavaScript'te çok iş parçacıklı yürütme elde edebilir ve modern web uygulamalarınızın performansını ve yanıt verebilirliğini iyileştirebilirsiniz.
JavaScript Programlamada Paralellik
Paralellik, performansı ve ölçeklenebilirliği geliştirmek için modern bilgi işlemde çok önemlidir. Bunu, mevcut kaynakları etkin bir şekilde kullanarak yapar.
Programlamada paralellik elde etmek için kullanılan yaygın bir teknik, çoklu iş parçacığıdır. Bununla birlikte, JavaScript iş parçacığı, tek iş parçacıklı bir sistemdir ve aynı anda yalnızca bir görevi işleyebilir. Bu, paralel program yürütmelerine aşina olmadığı anlamına gelir.
JavaScript Sahte Paralel Programlama
Paralellik hakkında yaygın bir yanılgı, bunu kullanarak başarabileceğinizdir. asenkron programlama teknikleri async/await, geri aramalar ve vaatler gibi:
// Bir ağ isteğini simüle eden zaman uyumsuz/bekliyor işlevi
zaman uyumsuzişlevveriyi getir() {
sabit cevap = beklemek gidip getirmek();
sabit veri = beklemek yanıt.json();
geri dönmek veri;
}// Alınan verileri konsola kaydeden geri arama işlevi
işlevgünlük verisi(veri) {
konsol.log (veri);
}// Birden çok sözü paralel olarak yürüten Promise.all() yöntemi
Söz.Tümü([
veriyi getir(),
veriyi getir(),
]).Daha sonra((sonuçlar) => {
konsol.log (sonuçlar);
});
// fetchData işlevini çağırın ve logData işlevini geri arama olarak iletin
fetchData().then (logData);
Bu teknikler aslında kodu paralel olarak yürütmez. JavaScript, tek iş parçacıklı tasarımı içinde paralel programlamayı taklit etmek için olay döngüsünü kullanır.
Olay döngüsü, JavaScript çalışma zamanı ortamının temel bir parçasıdır. Ana tek iş parçacığını engellemeden arka planda ağ istekleri gibi eşzamansız işlemleri yürütmenize olanak tanır.
Olay döngüsü, bir kuyruktaki yeni olayları veya görevleri sürekli olarak kontrol eder ve bunları sırayla birer birer yürütür. Bu teknik, JavaScript'in eşzamanlılık ve teorik paralellik elde etmesini sağlar.
Eşzamanlılık vs. paralellik
Eşzamanlılık ve paralellik, JavaScript dünyasında genellikle yanlış anlaşılır ve birbirinin yerine geçer.
JavaScript'te eşzamanlılık, görevlerin yürütülmesini üst üste bindirerek birden çok görevi yürütme yeteneğini ifade eder. Bir görevin diğerinin tamamlanmadan başlayabileceği, ancak görevlerin aynı anda ne başlayabileceği ne de sona erebileceği yer. Bu, JavaScript'in işlemleri verimli bir şekilde işlemesini sağlar, REST API'sinden veri almak gibi veya ana yürütme iş parçacığını engellemeden dosyaları okumak.
Öte yandan paralellik, birden çok iş parçacığında aynı anda birden çok görevi yürütme yeteneğini ifade eder. Bu arka plan iş parçacıkları, görevleri bağımsız olarak ve aynı anda yürütebilir. Bu, JavaScript uygulamalarında gerçek paralelliğe ulaşmak için fırsatlar yaratır.
JavaScript'in uygulamaları, şu yollarla gerçek paralelliğe ulaşabilir: Web Çalışanlarının kullanımı.
Web Çalışanları JavaScript'e Paralellik Getiriyor
Web Çalışanları, JavaScript kodunun ana yürütme dizisinden ayrı olarak arka plan dizilerinde çalışmasına izin veren modern web tarayıcılarının bir özelliğidir. Kullanıcı etkileşimlerini ve UI güncellemelerini işleyen ana iş parçacığından farklı olarak. Web Çalışanı, hesaplama açısından yoğun görevleri yerine getirmeye adanmış olacaktır.
Aşağıda JavaScript'te bir Web Worker'ın çalışmasının bir şema temsili bulunmaktadır.
Ana iş parçacığı ve Web Çalışanı, mesaj iletimini kullanarak iletişim kurabilir. Kullanmak mesaj sonrası mesaj gönderme yöntemi ve mesajda mesaj almak için olay işleyici, ileri geri talimat veya veri iletebilirsiniz.
Bir Web Çalışanı Oluşturma
Bir Web Çalışanı oluşturmak için ayrı bir JavaScript dosyası oluşturmanız gerekir.
İşte bir örnek:
// ana.js// Yeni bir Web Çalışanı oluştur
sabit işçi = yeni Çalışan("işçi.js");
// Web Worker'a bir mesaj gönder
işçi.postMessage("Ana ileti dizisinden merhaba!");
// Web Worker'dan gelen mesajları dinle
işçi.onmessage = işlev(etkinlik) {
konsol.kayıt('Web Worker'dan mesaj alındı:', olay.veri);
};
Yukarıdaki örnek, yolu çalışan komut dosyasına geçirerek yeni bir Web Çalışanı oluşturur (işçi.js) bir argüman olarak Çalışan yapıcı kullanarak Web Worker'a bir mesaj gönderebilirsiniz. mesaj sonrası yöntemini kullanarak Web Worker'dan gelen mesajları dinleyin ve mesajda olay işleyicisi.
Daha sonra çalışan komut dosyasını oluşturmalısınız (işçi.js) dosya:
// işçi.js
// Ana başlıktan gelen mesajları dinle
self.mesajda = işlev(etkinlik) {
konsol.kayıt('Ana ileti dizisinden mesaj alındı:', olay.veri);
// Ana konuya geri mesaj gönder
self.postMesaj("İşçi.js'den merhaba!");
};
Web Worker betiği, ana iş parçacığından gelen mesajları dinler. mesajda olay işleyicisi. Bir mesaj aldıktan sonra, içindeki mesajdan çıkış yaparsınız. olay.veri ile ana konuya yeni bir mesaj gönderin. mesaj sonrası yöntem.
Web Çalışanlarıyla Paralellikten Yararlanma
Web Çalışanları için birincil kullanım durumu, hesaplama açısından yoğun JavaScript görevlerini paralel olarak yürütmektir. Bu görevleri Web Çalışanlarına devrederek önemli performans iyileştirmeleri elde edebilirsiniz.
Ağır bir hesaplama yapmak için bir web çalışanı kullanmanın bir örneğini burada bulabilirsiniz:
// ana.jssabit işçi = yeni Çalışan("işçi.js");
// Hesaplama için verileri Web Worker'a gönder
işçi.postMessage([1, 2, 3, 4, 5]);
// Web Worker'dan gelen sonucu dinle
işçi.onmessage = işlev(etkinlik) {
sabit sonuç = olay.veri;
konsol.kayıt("Hesaplama sonucu:", sonuç);
};
Worker.js:
// Ana iş parçacığından gelen verileri dinle
self.mesajda = işlev (etkinlik) {
sabit sayılar = olay.veri;sabit sonuç = Ağır Hesaplama gerçekleştir (sayılar);
// Sonucu ana konuya geri gönder
self.postMessage (sonuç);
};
işlevAğır Hesaplama gerçekleştir(veri) {
// Sayı dizisinde karmaşık bir hesaplama yapın
geri dönmek veri
.harita((sayı) =>Matematik.pow (sayı, 3)) // Her sayının küpü
.filtre((sayı) => sayı % 20) // Çift sayıları filtrele
.azaltmak((toplam, sayı) => toplam + sayı, 0); // Tüm sayıları topla
}
Bu örnekte, ana iş parçacığından Web Worker'a bir sayı dizisi iletirsiniz. Web Çalışanı, sağlanan veri dizisini kullanarak hesaplamayı gerçekleştirir ve sonucu ana iş parçacığına geri gönderir. bu Ağır Hesaplama() işlev her sayıyı kendi küpüne eşler, çift sayıları filtreler ve son olarak onları toplar.
Sınırlamalar ve Hususlar
Web Çalışanları, JavaScript'te paralellik elde etmek için bir mekanizma sağlarken, birkaç sınırlamayı ve dikkate alınması gereken hususları dikkate almak önemlidir:
- Paylaşılan Bellek Yok: Web Çalışanları ayrı iş parçacıklarında çalışır ve ana iş parçacığıyla belleği paylaşmaz. Bu nedenle, ana iş parçacığından mesaj geçirmeden doğrudan değişkenlere veya nesnelere erişemezler.
- Serileştirme ve Serileştirme: Ana iş parçacığı ile Web Çalışanları arasında veri aktarırken, mesaj geçişi metin tabanlı bir iletişim olduğundan, verileri seri hale getirmeniz ve seri durumundan kaldırmanız gerekir. Bu işlem bir performans maliyetine neden olur ve uygulamanın genel performansını etkileyebilir.
- Tarayıcı Desteği: Web Çalışanları çoğu modern web tarayıcısında iyi desteklense de, bazı eski tarayıcılar veya sınırlı ortamlarda Web Çalışanları için kısmi destek olabilir veya hiç olmayabilir.
JavaScript'te Gerçek Paralellik Elde Edin
JavaScript'teki paralellik, birincil olarak tek iş parçacıklı bir dilde bile görevlerin gerçek eşzamanlı yürütülmesini sağlayan heyecan verici bir kavramdır. Web Workers'ın kullanıma sunulmasıyla, paralelliğin gücünden yararlanabilir ve JavaScript uygulamalarınızda önemli performans iyileştirmeleri elde edebilirsiniz.