Birden çok iş parçacığına alternatif olarak Node JS alternatifini kavrama


142

Doğru anlıyorsam Node JS bloke değildir ... bu yüzden bir veritabanından veya başka bir işlemden yanıt beklemek yerine başka bir şeye geçti ve daha sonra tekrar kontrol eder.

Ayrıca tek dişli.

Tüm bunlar, belirli bir Node JS işleminin tek bir CPU çekirdeğini tam ve verimli bir şekilde kullanabileceği anlamına gelir, ancak makinede başka hiçbir çekirdeği kullanmayacaktır, çünkü her seferinde birden fazla kullanmaz.

Bu elbette diğer işlemcilerin SQL veritabanı veya kasıtlı olarak ayrılmış diğer CPU ağır altyordamları gibi işlemler için ayrı bir işlem oldukları sürece yine de diğer işlemler tarafından kullanılabileceği anlamına gelir.

Ayrıca Node JS işleminin sonsuz bir döngü veya uzun çalışma işlevi olması durumunda, bu işlem sonsuz döngü veya uzun çalışma işlevi durdurulana (veya tüm işlem öldürülene) kadar hiçbir şekilde yararlı olmaz.

Bütün bunlar doğru mu? Anladığım kadarıyla doğru muyum?


2
"Düğüm" tek iş parçacıklı değil . Sadece JS / V8 motoru tek bir iş parçacığında çalışır. NodeJS'nin libuv kısmı çok iş parçacıklı. Bkz. NodeJS gerçekten Tek Dişli mi?
RaelB

Yanıtlar:


87

Hemen hemen doğru, evet. Node.js sunucusunun dahili bir iş parçacığı havuzu vardır, böylece engelleme işlemleri gerçekleştirebilir ve işler tamamlandığında ana iş parçacığını bir geri arama veya olayla bilgilendirebilir.

Bu yüzden iş parçacığı havuzu için başka bir çekirdeğin sınırlı bir şekilde kullanılacağını hayal ediyorum, örneğin engellemeyen bir dosya sistemi okursanız, bu büyük olasılıkla iş parçacığı havuzundan bir iş parçacığı bir okuma yapmak ve geri arama ayarlamak için söyleyerek uygulanır Bu, ana node.js programı başka bir şey yaparken okumanın farklı bir iş parçacığında / çekirdekte olabileceği anlamına gelir.

Ancak bir node.js bakış açısından, tamamen tek iş parçacıklıdır ve doğrudan birden fazla çekirdek kullanmaz.


2
Hala Node.js'de yeniyim ve buradaki tartışmayı takdir ediyorum. Ben sadece engelleme olmayan çağrıları dişli engelleme çağrıları tarafından desteklenmektedir varsayımları yapmak muhtemelen akıllıca değil (@jcoder bu varsayımlar etrafında kod mimar önerdi değil) işaret etmek istedim. Bu durumda, IO bir engelleme çağrısı ile ayrı bir iş parçacığında ele alınsa bile, bu iş parçacığı temel olarak IO'da yine de bekler, bu nedenle diğer çekirdeklerden / CPU'lardan faydalanmaz. Kullandığınız araçların gücünü kodlayın ve düşük düzeyli ayrıntılar hakkında çok fazla endişelenmeyin (sorun haline gelene kadar).
14'te wbyoung

öylesine biz-ebilmek yapmak diğer süreç kullanarak geri arama ön
yüzünde

37

Evet, anlayışınızın tamamen doğru olduğunu söyleyebilirim. Bu makale ( arşivlenmiş ), bu tasarımın arkasındaki mantığı oldukça iyi açıklamaktadır. Muhtemelen en önemli paragraf budur:

Apache çok iş parçacıklıdır: istek başına bir iş parçacığı oluşturur (veya işlem, konfektöre bağlıdır). Eşzamanlı bağlantı sayısı arttıkça ve birden çok benzeşimli istemciye hizmet vermek için daha fazla iş parçacığı gerektiğinde bu ek yükün nasıl bellek yediğini görebilirsiniz. Nginx ve Node.js çok iş parçacıklı değildir, çünkü iş parçacıkları ve işlemler ağır bir bellek maliyeti taşır. Tek iş parçacıklı ancak etkinlik tabanlıdır. Bu, tek bir iş parçacığında birçok bağlantıyı işleyerek binlerce iş parçacığının / işlemin oluşturduğu yükü ortadan kaldırır.


Makale yanlış. Çok iş parçacıklı bir apache mpm olmasına rağmen, hemen hemen tüm günlük kullanılan yapılandırmalarla uyumsuzdur. Apache çok işlemlidir ve şimdiye kadar çok iş parçacıklı değildir ve muhtemelen sonsuza kadar olacaktır. Felaket buluyorum, terminolojinin uygun anlamlarını manipüle etmek, sorunu çözmek yerine sadece gizlemek için güzel bir deney.
peterh - Monica'yı geri yükle

1
@peterh Mantıklı değilsiniz. Makale, apache'nin config'e bağlı olarak çok işlemli veya çok iş parçacıklı olduğunu belirten tamamen doğrudur. Çok sayıda bağlantı, birçok bağlantıyı ele alma konusunda daha da kötüdür, bu da Apache'nin ilk etapta belirtilmesinin tek sebebidir. Buna ek olarak, çok sık kullanılan PHP modülü kendi başına çok iş parçacıklıdır. Ve son olarak, bir apache uzmanı olmasam da, diğer makalelerden izlenimlerim, işçi MPM'sinin aslında çok yaygın olarak kullanıldığı yönündedir.
Michael Borgwardt

@MichaelBorgwardt Evet, apache çok iş parçacıklı olabilir ve ayrıca çok işlemli, bunu reddetmedim. Ancak php, çoklu işlem yapılandırmasıyla uyumsuzdur ve bir apache uzmanı olursanız kesinlikle bunu bilirsiniz. Çok yaygın kullanılan php modülü çok iş parçacıklı değildir. Bilgileriniz yanlış. Bir test yapılandırması denemenizi öneririm. Bu gerçek bir şey, tartışma meselesi değil, deneyin ve göreceksiniz.
peterh - Monica'yı

27

Bu eski bir iş parçacığı olsa bile, bir fikirle paylaşacağımı düşündüm, Node.JS uygulamasında bir çekirdeğin daha fazlasını nasıl kullanacağımı düşündüm. Nuray Altın'ın bahsettiği gibi - JXcore bunu yapabilir.

Basit örnek:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

Varsayılan olarak iki iş parçacığı vardır (ile değiştirebilirsiniz jxcore.tasks.setThreadCount())

Tabii ki görevlerle yapabileceğiniz çok daha fazlası var. Dokümanlar burada .

Bu konuda birkaç makale:



1

Node.js tek iş parçacıklı bir uygulamadır, ancak olay ve geri arama kavramı aracılığıyla eşzamanlılığı destekleyebilir. İşte Philip Roberts'ın olay döngülerinin javascript'te nasıl çalıştığını açıklayan videosu .

Videoyu izlemek için tıklayınız

(WebAPI'ler yerine Node.js'de C ++ API'leri vardır)


2
Bu bir yorum olmalı
Cherniv
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.