Memegang alternatif Node JS untuk multithreading


142

Jika saya mengerti dengan benar, Node JS bukan pemblokiran ... jadi alih-alih menunggu respons dari basis data atau proses lain, ini beralih ke sesuatu yang lain dan memeriksa kembali nanti.

Juga satu utas.

Jadi apakah semua ini berarti bahwa proses Node JS yang diberikan dapat sepenuhnya dan efisien memanfaatkan inti CPU tunggal tetapi tidak akan menggunakan inti lain pada mesin, karena, ia tidak akan pernah menggunakan lebih dari satu pada satu waktu.

Ini tentu saja berarti bahwa CPU lain masih dapat digunakan oleh proses lain untuk hal-hal seperti database SQL atau subrutin berat CPU yang dipisahkan secara sengaja selama keduanya merupakan proses yang terpisah.

Juga dalam hal proses Node JS memiliki loop tanpa akhir atau fungsi yang berjalan lama, proses itu tidak lagi berguna dengan cara apa pun sampai loop tanpa akhir atau fungsi yang berjalan lama dihentikan (atau seluruh proses mati).

Apakah ini benar? Apakah saya benar dalam pengertian saya?


2
"Node" bukan utas tunggal. Hanya mesin JS / V8 yang berjalan dalam satu utas. Bagian libuv dari NodeJS adalah multi-threaded. Lihat Apakah NodeJS benar-benar Utas Tunggal?
RaelB

Jawaban:


87

Cukup benar, ya. Server node.js memiliki kumpulan utas internal sehingga dapat melakukan operasi pemblokiran dan memberi tahu utas utama dengan panggilan balik atau peristiwa saat semuanya selesai.

Jadi saya membayangkan bahwa itu akan membuat penggunaan inti lain terbatas untuk kumpulan thread, misalnya jika Anda melakukan sistem file non-blocking baca ini kemungkinan dilaksanakan dengan memberi tahu thread dari kumpulan thread untuk melakukan pembacaan dan mengatur panggilan balik ketika itu dilakukan yang berarti bahwa pembacaan dapat terjadi pada utas / inti yang berbeda sementara program node.js utama melakukan sesuatu yang lain.

Tetapi dari sudut pandang node.js, itu sepenuhnya threaded tunggal dan tidak akan langsung menggunakan lebih dari satu inti.


2
Saya masih baru di Node.js dan menghargai diskusi di sini. Saya hanya ingin menunjukkan bahwa membuat asumsi bahwa panggilan non-pemblokiran didukung oleh panggilan pemblokiran berulir mungkin tidak bijaksana (bukan bahwa @ jcoder menyarankan kepada arsitek kode di sekitar asumsi ini). Dalam hal ini, bahkan jika IO ditangani pada utas terpisah dengan panggilan pemblokiran, utas itu pada dasarnya akan menunggu pada IO, sehingga tidak akan menggunakan core / CPU lainnya. Kode untuk kekuatan alat yang Anda gunakan dan jangan terlalu khawatir tentang detail tingkat rendah (sampai mereka menjadi masalah).
wbyoung

jadi kita bisa melakukan proses lain menggunakan callback seperti kode javascript di frontend
yussan

37

Ya, saya akan mengatakan bahwa pemahaman Anda sepenuhnya benar. Artikel ini ( diarsipkan ) menjelaskan alasan di balik desain ini dengan cukup baik. Ini mungkin paragraf paling penting:

Apache adalah multithreaded: ia menumbuhkan utas per permintaan (atau proses, itu tergantung pada conf). Anda dapat melihat bagaimana overhead memakan memori ketika jumlah koneksi bersamaan meningkat dan lebih banyak utas diperlukan untuk melayani banyak klien simulatan. Nginx dan Node.js bukan multithreaded, karena utas dan proses membawa biaya memori yang besar. Mereka single-threaded, tetapi berbasiskan peristiwa. Ini menghilangkan overhead yang dibuat oleh ribuan utas / proses dengan menangani banyak koneksi dalam satu utas.


Artikel itu salah. Meskipun ada mith apache multithreaded, ia tidak kompatibel dengan hampir semua konfigurasi yang digunakan sehari-hari. Apache adalah multi-proses, dan tidak multithread sampai sekarang, dan mungkin akan selamanya. Saya menganggapnya sebagai bencana besar, memanipulasi makna terminologi yang tepat hanyalah upaya yang bagus untuk menyembunyikan masalah, alih-alih menyelesaikannya.
peterh

1
@peterh Anda tidak masuk akal. Artikel ini sepenuhnya benar, menyatakan bahwa apache adalah multi-proses atau multithread tergantung pada konfigurasi. Kasus multiproces bahkan lebih buruk dalam hal menangani banyak koneksi, yang merupakan satu-satunya alasan Apache disebutkan di tempat pertama. Selain itu, modul PHP yang sangat umum digunakan adalah multithread semua dengan sendirinya. Dan akhirnya, walaupun saya bukan ahli apache, kesan saya dari artikel lain adalah bahwa MPM pekerja sebenarnya sangat umum digunakan.
Michael Borgwardt

@MichaelBorgwardt Ya, apache bisa multithreaded dan juga multiproses, saya tidak menyangkalnya. Tetapi php tidak kompatibel dengan konfigurasi multiproses, dan jika Anda akan menjadi ahli apache Anda pasti akan mengetahuinya. Modul php yang sangat umum digunakan tidak multithreaded. Informasi Anda salah. Saya sarankan untuk mencoba konfigurasi pengujian dan Anda akan melihat. Ini adalah hal yang faktual, bukan masalah perdebatan, cobalah dan Anda akan melihatnya.
peterh

27

Bahkan jika ini adalah utas lama, saya pikir, bahwa saya akan berbagi dengan sebuah ide, bagaimana memanfaatkan lebih dari satu inti dalam aplikasi Node.JS. Seperti yang disebutkan Nuray Altin - JXcore dapat melakukannya.

Contoh sederhana:

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

Secara default ada dua utas (Anda dapat mengubahnya dengan jxcore.tasks.setThreadCount())

Tentu saja ada banyak lagi yang dapat Anda lakukan dengan tugas. Dokumen ada di sini .

Beberapa artikel tentang hal itu:



1

Node.js adalah aplikasi single-threaded, tetapi dapat mendukung konkurensi melalui konsep acara dan panggilan balik. Berikut adalah video oleh Philip Roberts yang menjelaskan bagaimana loop acara bekerja di javascript.

Klik di sini untuk melihat videonya

(Alih-alih WebAPI ada C ++ API di Node.js)


2
Ini harus menjadi komentar
Cherniv
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.