Apa perbedaan antara arsitektur yang digerakkan oleh event Node.js dan pemrograman multi-utas dalam bahasa lain?


Jawaban 1:

Baik dalam paradigma event-driven dan multi-threaded kode berjalan di dalam proses sistem operasi.

Ketika proses menjalankan beberapa utas, utas ini berbagi memori proses (ruang alamat) baik untuk membaca dan menulis.

JavaScript yang menggerakkan Node.js adalah desain tunggal-utas. Setiap fungsi dijamin berjalan hingga selesai, dan tidak ada kode JavaScript lain dalam proses saat ini yang akan berjalan selama fungsi tersebut berjalan. Kejadian asinkron secara alami (jaringan, input-output disk, pengatur waktu, peristiwa perangkat keras dan sistem operasi lainnya) ditangani oleh mesin yang menambahkan fungsi JavaScript yang terdaftar sebagai penangan (atau panggilan balik) untuk peristiwa ini ke antrian loop acara yang akan dieksekusi setelah fungsi di depan antrian telah selesai.

Dalam paradigma multi-utas, dua atau lebih utas menjalankan kode secara paralel, sehingga selama suatu fungsi menjalankan bagian kode yang berbeda dapat berjalan juga pada inti prosesor yang berbeda, mungkin membaca atau menulis ke alamat memori yang sama. Ini dapat mengakibatkan kondisi memori yang tidak konsisten kecuali mekanisme sistem operasi khusus (primitif sinkronisasi) digunakan oleh kode untuk mengelola akses ke memori bersama.



Jawaban 2:

Ini adalah pertanyaan yang bagus, “Apa perbedaan antara arsitektur berbasis-event Node.js dan pemrograman multi-utas dalam bahasa lain?”.

Kita bisa dan harus memecahnya sedikit.

  • Arsitektur berbasis acara Node.

Arsitektur yang didorong oleh peristiwa tidak eksklusif untuk Node, mis., Tornado (Python), Vertx (Jawa), Akka (Scala), ReactiveX (berbagai bahasa).

  • Pemrograman multi-utas dalam bahasa lain.

Perhatikan bahwa JavaScript, berdasarkan desain, tidak mendukung banyak utas. Meskipun mendukung webworkers, yang, sejauh yang saya tahu, dapat berfungsi sebagai utas.

Jadi event-driven tidak unik untuk Node dan multi-threading dapat dilakukan di Node.

Jadi ada dua pertanyaan di sini: "Apa perbedaan antara event-driven vs multi-threading", dan "Apa perbedaan antara Node dan bahasa lain (kerangka kerja)". Saya akan fokus pada yang terakhir karena tampaknya itulah maksud dari pertanyaan.

Saya katakan apa yang membuat Node spesial adalah bahwa penulis membuatnya untuk menghindari pemblokiran IO ketika membangun aplikasi web. Budaya komunitas Node adalah untuk menekankan dan membangun kekuatan IO yang tidak menghalangi. Anda tidak akan menemukan terlalu banyak perpustakaan pihak ke-3 yang melakukan pemblokiran panggilan. Sebagai pengembang yang menggunakan Node, Anda tidak mungkin mengalami operasi pemblokiran halus dalam kode Anda. Sedangkan dalam bahasa lain, pengembang yang naif mungkin secara tidak sengaja melakukan panggilan yang sangat tidak efisien seperti membaca dari koneksi basis data.

Selain itu, Anda harus benar-benar membaca tentang beberapa model untuk "konkurensi" dan memahami pro dan kontra masing-masing. Poin bonus untuk menghargai mengapa multi-threading dapat diterima untuk waktu yang lama.



Jawaban 3:

perbedaan konseptual cukup mudah untuk membungkus kepala Anda.

Dalam arsitektur yang digerakkan oleh peristiwa, program Anda berjalan dalam satu putaran ulir berkelanjutan (Anda dapat melakukan multi-threading dalam simpul tetapi tidak khawatir tentang itu sekarang). Ketika sebuah acara menyala, pekerjaan terserah pada tumpukan panggilan untuk ditangani pada waktu luang program.

Arsitektur multi-utas umumnya mengirimkan utas baru ketika harus menunggu tindakan. Jadi, Anda membuat panggilan ke database dan Anda memutar utas baru yang akan melakukan semua hal yang Anda butuhkan dan melakukan apa yang Anda perlu dan menyimpulkan atau bergabung kembali dengan utas asli.

Kedua metode ini sangat berguna untuk berbagai hal. Event didorong sangat bagus untuk antarmuka pengguna dan server karena program Anda tidak tahu kapan bahkan yang baru akan terjadi dan sering peristiwa akan datang berurutan. Sementara threading diperlukan untuk pekerjaan berat komputasi di mana Anda ingin memecah masalah menjadi potongan-potongan yang jauh lebih kecil (atau Anda mendekati batas loop ulir tunggal Anda).