Node.js Dersleri 4 - Engellemeye ve Engellememeye Genel Bakış

Wasee

Kalfa
25 Eki 2020
53
2
0
Selam dostlarım ve node.js severler bugün yeni bir dersimiz ile karşınızdayım.

Umarım sizin için detaylı ve temiz bir anlatım yapmışımdır iyi okumalar.

Bu genel bakış, Node.js'de engelleyen ve engellemeyen aramalar arasındaki farkı kapsar. ancak bu konular hakkında önceden bilgi sahibi olmak gerekmez. Okuyucuların JavaScript dili ve Node.js geri arama kalıbı hakkında temel bir anlayışa sahip olduğu varsayılır.

1 - Engelleme (Blocking)

Engelleme, Node.js işleminde ek JavaScript çalıştırmanın JavaScript olmayan bir işlem tamamlanana kadar beklemesi gerektiği zamandır. Bunun nedeni, bir engelleme işlemi gerçekleşirken olay döngüsünün JavaScript'i çalıştırmaya devam edememesidir.

Node.js'de, I / O gibi JavaScript olmayan bir işlemi beklemek yerine CPU yoğun olduğu için düşük performans sergileyen JavaScript, genellikle engelleme olarak adlandırılmaz. Node.js standart kitaplığındaki libuv kullanan eşzamanlı yöntemler, en yaygın kullanılan engelleme işlemleridir. Yerel modüller de engelleme yöntemlerine sahip olabilir.

Node.js standart kitaplığındaki tüm G / Ç yöntemleri, engelleme yapmayan ve geri arama işlevlerini kabul eden eşzamansız sürümler sağlar. Bazı yöntemlerin, Sync ile biten adlara sahip engelleme karşılıkları da vardır.


2 - Karşılaştırma Kodu

Engelleme yöntemleri eşzamanlı olarak yürütülür ve engellemeyen yöntemler eşzamansız olarak çalıştırılır.

Dosya Sistemi modülünü örnek olarak kullanırsak, bu eşzamanlı bir dosyadır:

JavaScript:
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // Dosya okunana kadar burada engeller


Ve işte eşzamanlı olmayan bir örnek:

JavaScript:
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
});

İlk örnek, ikinciden daha basit görünür, ancak ikinci satırın, dosyanın tamamı okunana kadar herhangi bir ek JavaScript'in yürütülmesini engellemesi dezavantajına sahiptir. Eşzamanlı sürümde bir hata atılırsa yakalanması gerekeceğini veya işlemin çökeceğini unutmayın. Eşzamansız sürümde, bir hatanın gösterildiği gibi atılıp atılmayacağına karar vermek yazara bağlıdır.

Örneğimizi biraz geliştirelim :


JavaScript:
const fs = require('fs');
const data = fs.readFileSync('/file.md'); //dosya okunana kadar burada engeller
console.log(data);
moreWork(); // console.log'dan sonra çalışacak

Ve işte benzer, ancak eşdeğer olmayan eşzamansız bir örnek:

JavaScript:
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
moreWork(); // console.log'dan önce çalışacak



Yukarıdaki ilk örnekte, console.log moreWork () 'den önce çağrılacaktır. İkinci örnekte fs.readFile () engelleyici değildir, bu nedenle JavaScript yürütmesi devam edebilir ve ilk önce moreWork () çağrılır. Dosyanın okunmasının tamamlanmasını beklemeden moreWork () çalıştırma yeteneği, daha yüksek verim sağlayan önemli bir tasarım seçeneğidir.


3 - Eşzamanlılık ve Verimlilik




Node.js'deki JavaScript yürütmesi tek iş parçacıklıdır, bu nedenle eşzamanlılık, olay döngüsünün diğer işleri tamamladıktan sonra JavaScript geri arama işlevlerini yürütme kapasitesini ifade eder. Eşzamanlı olarak çalışması beklenen herhangi bir kod, olay döngüsünün I / O gibi JavaScript dışı işlemler gerçekleşirken çalışmaya devam etmesine izin vermelidir.

Örnek olarak, bir web sunucusuna yapılan her talebin tamamlanması 50ms sürdüğü ve bu 50ms'nin 45ms'sinin eşzamansız olarak yapılabilen veritabanı I / O olduğu bir durumu ele alalım. Engellemeyen eşzamansız işlemlerin seçilmesi, diğer istekleri işlemek için istek başına 45 ms'lik bir alan sağlar. Bu, engelleme yöntemleri yerine engelleme olmayan yöntemleri kullanmayı seçerek kapasitede önemli bir farktır.

Olay döngüsü, eşzamanlı çalışmayı gerçekleştirmek için ek iş parçacıkları oluşturulabilen diğer birçok dildeki modellerden farklıdır.

4 - Engelleme ve Engellemeyen Kodu Karıştırma Tehlikeleri

- I / O ile uğraşırken kaçınılması gereken bazı modeller vardır. Bir örneği inceleyelim :

JavaScript:
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
fs.unlinkSync('/file.md');


Yukarıdaki örnekte, fs.unlinkSync () büyük olasılıkla fs.readFile () 'den önce çalıştırılır ve bu dosya.md dosyasını gerçekten okunmadan önce siler. Tamamen engellemeyen ve doğru sırada yürütülmesi garantili olan bunu yazmanın daha iyi bir yolu şudur:
JavaScript:
const fs = require('fs');
fs.readFile('/file.md', (readFileErr, data) => {
  if (readFileErr) throw readFileErr;
  console.log(data);
  fs.unlink('/file.md', (unlinkErr) => {
    if (unlinkErr) throw unlinkErr;
  });
});

Yukarıdakiler, fs.readFile () işlevinin geri çağrısı içinde fs.unlink () öğesine, işlemlerin doğru sırasını garanti eden, engellemeyen bir çağrı yerleştirir.

bugünki dersimiz bukadardı birdahaki derslerde görüşmek üzere görüşürüzz :)

(kendimi hoca gibi hissettim :D)
 
  • Like
Tepkiler: yilmaztuna