NodeJS nasıl “engellemeyebilir”?


14

NodeJS öğreniyorum ve sadece bir şeyi açıklığa kavuşturmak istedim. Şimdiye kadarki bazı öğretici derslerde ve kitaplarda, Düğüm'ün “engellemeyen” mimarisini - veya daha ziyade engellemeyen bir şekilde kodlamanın mümkün olduğunu (ve tüm noktayı önerdiğini) çok erken anlattılar.

Örneğin, bu örnek bir veritabanından veri almak için eşzamansız bir yol okuduğum bir kitapta verildi.

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

(Anladığım kadarıyla) olan şey, Düğüm veritabanına çağrı yapar, daha sonra çağrı yığınında olabilecekleri işlemeye devam eder. Veritabanı isteği tamamlandığında, anonim geri çağırma işlevindeki veri değişkeni doldurulur ve bu işlev çağrı yığınına eklenir (ve daha sonra Düğüm ona ulaştığında yürütülür).

Benim sorum, veritabanı isteğini tam olarak işlemek nedir? Kesinlikle Node bunu yaparken engellemeli mi? Veritabanı talebine ne dikkat ediyor? Veya Düğüm harici bir kaynağa eşzamansız bir HTTP GET isteği bekliyorsa, Düğüm'ün çağrı yığınını işlemeye devam etmesine ve "engellememesine" izin veren bu istekle ilgilenen nedir?

Yanıtlar:


17

Node.js "engellenmemesi" olarak tanımlandığında, bu özellikle IO'sunun engellenmediği anlamına gelir. Düğüm, IO'sunu platformdan bağımsız bir şekilde ele almak için libuv'u kullanır . Windows'da IO tamamlama bağlantı noktalarını, Unix'te epoll / kqueue / select / etc'yi kullanır. Böylece, engellemeyen bir IO isteği yapar (arka plan iş parçacığı izlemesine sahip olabilir, ancak bu asla JavaScript'e maruz kalmaz) ve sonuç olarak, ana döngüdeki JavaScript geri aramasını çağıran olay döngüsünde sıraya alır (okuma: yalnızca) JavaScript iş parçacığı.

Veritabanları için kütüphanenin nasıl yazıldığına bağlıdır. İletişim kurmak için HTTP kullanıyorsa (bazı NoSQL veritabanlarının yaptığı gibi), standart düğüm httpkitaplığı kullanılarak saf JavaScript'te kolayca yazılabilir . Bunu başka bir şekilde yaparsa, bu kütüphaneye kalmış. C / C ++ ile yazılabilir ve soyutlama hiçbir zaman JavaScript'e maruz kalmadıkça arka plan iş parçacıkları kullanabilir.

Veritabanı isteğinin ne "işlendiği" sorusuna gelince, ideal olarak tek yapılması gereken bir kütüphaneye basit bir mesaj göndermek (örneğin bir SQL ifadesi veya başka bir sorgu veya bağlantı isteği) ve bu noktada JavaScript'iniz chugging devam ediyor. Kitaplık bir ileti göndermeye hazır olduğunda, düğümün olay kuyruğuna geri aramayı çalıştıran ve bu kod snippet'inin çalışmasına izin veren bir ileti gönderir.


Orada nethttp bulunmadığı durumlarda paketi.
Florian Margaine

Yardımcı olabilecek detay. Düğüm V8 JS motorundan yararlanır. V8'in en iyi özelliklerinden biri, C / C ++ süreçlerini JS çağrılarına bağlama kolaylığıdır. JavaScript işlevleri engelleniyor, ancak bir işlevin yaptığı tek şey, başlığın altında engellenmeyen bir şey çağırmaktır. Bu işlem tamamlandığında başka bir JS işlevi yanıt verir. Birbirini engelleyen JS işlevleri, aynı dosya konumuna aynı anda bir yazma zamanlama gibi bir şey yapmaya çalıştığınız anlamına gelmez, bu da çok iş parçacığının yönetilmesi gerektiğini varsayar. Bir şeyleri sıraya koymak için ilk olarak hangi talebin geldiğini her zaman açıktır.
Erik Reppen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.