Python dan Ruby juga memiliki kerangka kerja seperti itu, tetapi karena perpustakaan yang berisi kode sinkron tidak dapat dihindari digunakan dalam penggunaan aktual, mereka tidak tumbuh dewasa. Sebelum node.js, pemrograman sisi server Javascript hampir kosong, jadi Node.js dapat membuat pustaka kode di mana semua IO tidak sinkron.
Kemacetan sebagian besar aplikasi web ada di IO, yaitu, membaca dan menulis disk, membaca dan menulis jaringan, dan membaca dan menulis database. Strategi seperti apa yang akan digunakan untuk menunggu periode waktu ini telah menjadi poin kunci dalam meningkatkan kinerja.
Strategi PHP: Jalankan beberapa proses, tunggu IO selesaikan secara langsung. Kerugian: Beberapa proses mengkonsumsi beberapa memori, membuatnya sulit untuk berbagi data antar proses.
C/C ++ Strategi Umum: Jalankan multi-threading, dan program mempertahankan status kunci itu sendiri. Kerugian: Biaya pengembangan tinggi, mudah membuat kesalahan, dan sulit untuk debug.
Python (Tornado): Beberapa permintaan dieksekusi secara bergantian dalam satu proses, dan beralih ke permintaan lain ketika saya bertemu io. Kerugian: Untuk satu permintaan, waktu masih belum digunakan secara paling efisien.
Apa itu "waktu penggunaan paling efisien"? Misalnya, sekarang ada dua kueri database yang tidak terkait. Dalam PHP, seseorang biasanya akan dieksekusi terlebih dahulu, dan yang kedua akan dieksekusi setelah eksekusi selesai (total waktu adalah A + B). Jelas, ini bukan yang paling efisien. Dua pertanyaan harus dieksekusi pada saat yang sama, dan waktunya maks (a, b).
Masalah dengan Python dan bahasa lain yang mendukung multithreading adalah bahwa pada tingkat bahasa, sulit bagi programmer untuk memberi tahu mesin virtual bahwa dua operasi harus dieksekusi secara bersamaan. Bahkan jika ada cara, itu cukup merepotkan. Kebanyakan orang terlalu malas untuk digunakan (tidak layak digunakan). Karena Node.js dengan gila memaksa semua eksekusi IO secara tidak sinkron, pemrogram Node.js juga dapat dikatakan terbiasa dengannya. Dalam kombinasi dengan beberapa perpustakaan untuk meningkatkan keterbacaan kode (janji, async), ia dapat dengan mudah memungkinkan operasi yang tidak relevan dieksekusi secara paralel.
Pembicaraan di atas tentang implementasi IO asinkron, jadi di mana keunggulan IO asinkron yang tercermin? Bahkan, IO asinkron tidak dapat secara ajaib mengurangi tekanan pada server. Untuk menambahkan server, Anda masih perlu menambahkan server, tetapi IO asinkron akan mengurangi waktu satu permintaan dan menghapus waktu tunggu yang tidak berarti dalam satu permintaan. Oleh karena itu, permintaan yang diproses dalam satuan waktu belum berubah, tetapi waktu pemrosesan untuk setiap permintaan telah berkurang. Dari perspektif ini, server juga menyimpan beberapa sumber daya - yaitu, mempertahankan memori yang dikonsumsi oleh setiap koneksi yang diminta.