Sudah dua bulan sejak saya belajar dan menggunakan Node.js, saya menggunakan ekspres digabungkan dengan mongoose untuk menulis aplikasi web dan satu set api web yang RESTful Tapak web rasmi Node.js: Node.js menggunakan model I/O yang dipacu peristiwa dan tidak menyekat yang menjadikannya ringan dan cekap Jadi apakah maksud model I/O yang tidak menyekat?
Model IO tidak menyekat
Pertama sekali, operasi IO sudah pasti memakan masa Apabila pelayan menerima sejumlah besar permintaan, mencipta proses atau urutan untuk setiap permintaan juga menambahkan overhed memori tambahan dan mungkin membuang lebih banyak sumber masa.
Memandangkan Node.js dipacu peristiwa, ia menggunakan gelung peristiwa untuk menyelesaikan masalah kesesakan yang disebabkan oleh operasi IO. Dalam Node.js, operasi IO biasanya mempunyai fungsi panggil balik Apabila operasi IO selesai dan kembali, fungsi panggil balik akan dipanggil dan utas utama akan terus melaksanakan kod seterusnya. Mari kita gunakan contoh untuk menggambarkan masalah ini:
request('http://www.google.com', function(error, response, body) { console.log(body); }); console.log('Done!');
Maksud kod ini adalah untuk membuat permintaan kepada 'http://www.google.com' Apabila permintaan kembali, fungsi panggil balik dipanggil untuk mengeluarkan maklumat respons. Disebabkan oleh mekanisme pengendalian Node.js, selepas kod ini dijalankan, 'Selesai!' akan dikeluarkan ke konsol serta-merta, dan kemudian maklumat tindak balas akan dikeluarkan selepas tempoh masa.
Gelung acara gelung acara
Seterusnya, mari kita bincangkan mekanisme gelung acara. Mula-mula, mari bercakap tentang memanggil 桟 Sebagai contoh, terdapat sekeping kod berikut:
function A(arg, func){ var a = arg; func(); console.log('A'); } function B(){ console.log('B'); } A(0, B);
Apabila kod dilaksanakan, fungsi A terlebih dahulu ditolak ke dalam baldi panggilan untuk menjadi elemen teratas tindanan dan mula melaksanakan A. Semasa proses pelaksanaan, fungsi B ditolak ke dalam baldi panggilan untuk menjadi elemen teratas bagi timbunan Selepas pelaksanaan B selesai, B Selepas terkeluar daripada timbunan panggilan, A menjadi elemen teratas timbunan semula Selepas pelaksanaan A selesai, A muncul daripada timbunan panggilan, dan timbunan panggilan menjadi melahu.
Terdapat baris gilir mesej dalam masa jalan Javascript, dan mesej itu dikaitkan dengan fungsi panggil balik Apabila peristiwa dicetuskan, jika acara itu mempunyai fungsi panggil balik yang sepadan, mesej akan ditambahkan pada baris gilir mesej.
Melihat kembali apa sebenarnya gelung peristiwa itu, selepas kod mula dilaksanakan, fungsi ditolak secara berterusan ke dalam baldi panggilan Ambil contoh di atas, permintaan ditolak ke dalam baldi panggilan, dan fungsi ini akan dilaksanakan An http permintaan (permintaan http ini akan dilaksanakan oleh modul asas Node.js Pada masa yang sama, peristiwa pelengkapan permintaan dikaitkan dengan fungsi panggil balik Permintaan itu muncul daripada timbunan panggilan, dan console.log adalah ditolak ke dalam timbunan panggilan untuk memulakan pelaksanaan. Apabila permintaan selesai, acara penyiapan dicetuskan dan mesej ditambahkan pada baris gilir mesej, baris gilir mesej akan terlebih dahulu menyemak sama ada penumpuk panggilan tidak berfungsi, ia akan menunggu sehingga penumpuk panggilan melahu dan kemudian Ketua baris gilir mesej muncul, dan fungsi panggil balik yang dikaitkan dengan mesej dilaksanakan.
Ringkasan
Di atas ialah ringkasan konsep model tanpa sekatan dan gelung peristiwa. Mekanisme gelung peristiwa ini bukan unik untuk Node.js, dan kod Node.js dilaksanakan dalam satu utas Apakah kelebihannya apabila menghadapi sejumlah besar permintaan serentak?
Gambar di atas menunjukkan gambar rajah seni bina Node.js Terdapat modul di bahagian bawah Node.js yang bertanggungjawab untuk mengekalkan kumpulan benang Apabila permintaan IO dikeluarkan, modul bawah Node.js akan buat urutan baharu untuk memproses permintaan , dan kemudian kembalikan hasilnya ke lapisan atas selepas selesai. Kemudian, apabila terdapat berbilang permintaan, modul asas Node.js akan menggunakan seberapa sedikit benang yang mungkin untuk menyelesaikan kebanyakan tugasan Jika terdapat benang terbiar, ia akan terus digunakan untuk melakukan perkara lain, itulah yang saya katakan lebih awal. Dari segi membuka proses atau utas baharu untuk setiap permintaan, sudah pasti ia lebih "pintar" dan lebih cekap.
Artikel ini adalah ringkasan pembelajaran Node.js Jika terdapat sebarang masalah atau kekurangan, sila tegur dan betulkan saya.