Node.js, desteklenen işletim sistemleri (en azından Unix, OS X ve Windows) tarafından sağlanan eşzamansız (engellemeyen) giriş / çıkış için apis / syscall'ları özetleyen çapraz platform kütüphanesi libuv üzerine kurulmuştur .
Asenkron IO
Bu programlama modelinde, dosya sistemi tarafından yönetilen cihazlarda ve kaynaklarda (soketler, dosya sistemi vb.) Açma / okuma / yazma işlemi çağıran iş parçacığını engellemez (tipik eşzamanlı c benzeri modelde olduğu gibi) ve yeni veriler veya olaylar mevcut olduğunda bildirilecek işlem (çekirdek / OS düzeyinde veri yapısında). Web sunucusu benzeri bir uygulama söz konusu olduğunda süreç, bildirilen olayın hangi istek / bağlama ait olduğunu bulmaktan ve isteği oradan işlemeye devam etmekten sorumludur. Bunun, yeni olayları işlemek için tek bir iş parçacıklı işlemin yürütülmesi için bir işlem dağıtıcısına vermesi gerektiğinden, işletim sisteminin isteğini başlatandan farklı bir yığın karesinde olacağınız anlamına geleceğini unutmayın.
Tarif ettiğim modelle ilgili problem, doğası gereği ardışık olmadığı için programcı için akıl alması ve akıl yürütmesinin zor olmamasıdır. "A fonksiyonunda talepte bulunmanız ve sonucu A'dan gelen yerlilerin genellikle mevcut olmadığı farklı bir fonksiyonda ele almanız gerekir."
Düğümün modeli (Devam Tarzı ve Etkinlik Döngüsü)
Düğüm, programcıyı belirli bir programlama stili kullanmaya teşvik ederek bu modeli biraz daha senkronize hale getirmek için javascript'in dil özelliklerinden yararlanma sorununu ele alır. ES talep eden her fonksiyonun imzası vardır function (... parameters ..., callback)ve talep edilen işlem tamamlandığında çağrılacak bir geri çağrı verilmelidir (çoğu zaman işletim sisteminin tamamlanma sinyalini beklemek için harcandığını unutmayın. başka işler yapmak için harcanan). Javascript'in kapanma desteği, geri arama gövdesi içindeki dış (çağrı) işlevinde tanımladığınız değişkenleri kullanmanıza olanak tanır - bu, düğüm çalışma zamanı tarafından bağımsız olarak çağrılacak farklı işlevler arasındaki durumu korumanıza olanak tanır. Ayrıca bkz . Devamlı Geçiş Stili .
Ayrıca, bir IO işlemi üreten bir işlev çağrıldıktan sonra, çağrı işlevi genellikle returndüğümün olay döngüsünü kontrol eder . Bu döngü, yürütülmesi planlanan bir sonraki geri aramayı veya işlevi çağırır (büyük olasılıkla ilgili olay işletim sistemi tarafından bildirildiği için) - bu, birden fazla isteğin eşzamanlı olarak işlenmesine izin verir.
Düğümün olay döngüsünü çekirdeğin dağıtım programına benzer şekilde düşünebilirsiniz : çekirdek, bekleyen IO tamamlandıktan sonra engellenen bir iş parçacığının yürütülmesini zamanlarken düğüm karşılık gelen olay gerçekleştiğinde bir geri arama zamanlayacaktır.
Yüksek eşzamanlılık, paralellik yok
Son bir açıklama olarak, "kodunuz hariç her şey paralel olarak çalışır" ifadesi, düğümünüzün kodunuzun yüz binlerce açık soketten gelen istekleri tek bir iş parçacığıyla çoğaltarak ve sıralayarak eşzamanlı olarak işlemesine izin verdiği noktayı yakalamak için iyi bir iş çıkarır. tek bir yürütme akışında mantık ("her şey paralel çalışır" demek muhtemelen doğru değildir - bkz. Eşzamanlılık - Paralellik - Fark nedir? ). Çoğu zaman ağ veya disk (veritabanı / soketler) beklemeye harcandığından ve mantık gerçekten CPU yoğun olmadığından, yani: IO'ya bağlı iş yükleri için iyi çalıştığından, bu webapp sunucuları için oldukça iyi çalışır .