Mengoptimumkan Gelung Peristiwa Node.js
Dalami gelung peristiwa untuk mengenal pasti operasi yang menyekat dan mengoptimumkan kod tak segerak bagi prestasi yang lebih baik.
Mengoptimumkan Gelung Peristiwa Node.js ialah pelajaran Kem Intensif Pembangunan Backend Node.js percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kem Intensif Pembangunan Backend Node.js, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kem Intensif Pembangunan Backend Node.js merangkumi sejumlah 4 pelajaran.
Gelung Peristiwa: Nadi Node.js
Selamat datang! Node.js menggunakan model satu utas, tetapi ia mengendalikan banyak operasi secara serentak berkat Gelung Peristiwa. Gelung ini sentiasa menyemak tugas yang perlu dilaksanakan.
Mengoptimumkan gelung peristiwa amat penting untuk aplikasi Node.js berprestasi tinggi. Gelung ini memastikan pelayan anda kekal responsif dan mengendalikan ramai pengguna dengan cekap.

Memahami Operasi yang Menyekat
operasi yang menyekat (atau operasi segerak) ialah operasi yang menghentikan pelaksanaan semua kod JavaScript lain sehingga operasi itu selesai. Bayangkan seorang juruwang tunggal berhenti untuk mengira baki bagi seorang pelanggan, sementara barisan panjang pelanggan lain menunggu.
Dalam Node.js, operasi yang menyekat membekukan keseluruhan gelung peristiwa, lalu menghalangnya daripada memproses permintaan masuk atau tugas lain. Hal ini menyebabkan masa tindak balas menjadi perlahan dan pengalaman pengguna menjadi kurang baik.
Mengenal Pasti Kod yang Membebankan CPU
tugas terikat CPU ialah operasi yang menggunakan banyak masa pemproses. Operasi ini tidak menunggu sumber luaran seperti pangkalan data atau permintaan rangkaian; operasi ini hanya melakukan pengiraan.
- Pengiraan kompleks
- Transformasi data yang berat
- Gelung segerak merentas set data yang sangat besar
- Pemprosesan imej atau kriptografi
Perkara ini merupakan punca lazim gelung peristiwa tersekat jika tidak dikendalikan dengan teliti.
Demo: Gelung yang Menyekat
Cuba jalankan contoh ini. Perhatikan bahawa mesej 'After blocking loop' tertangguh. Jika ini ialah pelayan, pelayan tersebut tidak akan memberikan respons kepada permintaan lain semasa gelung itu dilaksanakan.
console.log("Before blocking loop.");
const startTime = Date.now();
// Simulate a CPU-intensive task
for (let i = 0; i < 5000000000; i++) {
// Do nothing, just loop
}
const endTime = Date.now();
console.log(`Blocking loop finished in ${endTime - startTime}ms.`);
console.log("After blocking loop.");
// This will be delayed because the loop blocked the event loop
setTimeout(() => {
console.log("This message is from setTimeout (delayed).");
}, 0);Memecahkan Kerja Terikat CPU
Untuk mengelakkan penyekatan, kita boleh memecahkan tugas terikat CPU yang besar kepada bahagian-bahagian kecil dan menangguhkan pelaksanaannya. Hal ini membolehkan gelung peristiwa memproses tugas lain antara bahagian-bahagian tersebut.
- Gunakan
setImmediate()untuk menjadualkan fungsi supaya dijalankan selepas fasa tinjauan semasa gelung peristiwa. - Gunakan
process.nextTick()untuk menjadualkan fungsi supaya dijalankan sebelum sebarang operasi I/O dalam fasa gelung peristiwa semasa. - Untuk pengiraan yang benar-benar berat, gunakan Utas Pekerja.
Demo: Menangguhkan dengan setImmediate
Di sini, kita menyusun semula gelung yang menyekat menggunakan setImmediate. Hal ini membolehkan gelung peristiwa memproses panggilan balik setTimeout dengan lebih cepat, walaupun keseluruhan kerja masih dilaksanakan.
console.log("Before deferred loop.");
let count = 0;
const maxCount = 5000000000;
function doWorkChunk() {
const chunkSize = 10000000; // Process 10 million iterations at a time
const start = count;
const end = Math.min(count + chunkSize, maxCount);
for (let i = start; i < end; i++) {
// Simulate work
}
count = end;
if (count < maxCount) {
setImmediate(doWorkChunk); // Schedule next chunk immediately
} else {
console.log("Deferred loop finished.");
}
}
const startTime = Date.now();
setImmediate(doWorkChunk); // Start the deferred work
console.log("After initiating deferred loop.");
// This setTimeout will run much sooner now
setTimeout(() => {
console.log("This message is from setTimeout (not delayed).");
const endTime = Date.now();
console.log(`Total time (approx) for deferred loop: ${endTime - startTime}ms.`);
}, 0);process.nextTick berbanding setImmediate
Kedua-dua process.nextTick() dan setImmediate() menangguhkan pelaksanaan, tetapi kedua-duanya beroperasi dalam fasa gelung peristiwa yang berbeza:
process.nextTick(): Menjalankan panggilan baliknya *sebelum* sebarang panggilan balik I/O dalam giliran gelung peristiwa *semasa*. Ia sering digunakan untuk pengendalian ralat atau menyeragamkan tingkah laku panggilan balik.setImmediate(): Menjalankan panggilan baliknya dalam fasa *semakan*, *selepas* panggilan balik I/O dan sebelum pemasa dalam giliran gelung peristiwa *seterusnya*. Ia sesuai untuk memecahkan tugas yang berjalan lama.
Melangkaui Utas Utama: Utas Pekerja
Untuk operasi yang benar-benar menggunakan CPU secara intensif dan tidak mudah dipecahkan kepada bahagian-bahagian kecil, Node.js menawarkan Utas Pekerja. Utas ini membolehkan anda menjalankan kod JavaScript secara selari dalam utas yang berasingan sepenuhnya.
Utas Pekerja langsung tidak menyekat gelung peristiwa utama, menjadikannya sesuai untuk pengiraan berat seperti penyulitan data, simulasi kompleks atau pemprosesan fail besar.
Demo: Utas Pekerja Asas
Beginilah cara fail main.js menggunakan pekerja untuk memindahkan pengiraan berat. Utas utama kekal lapang untuk melakukan kerja lain.
Anda juga memerlukan fail worker.js dalam direktori yang sama:
const { parentPort } = require('worker_threads');
parentPort.on('message', (task) => {
console.log('Worker received task:', task);
let result = 0;
for (let i = 0; i < task; i++) {
result += i; // Simulate heavy computation
}
parentPort.postMessage(result);
});const { Worker } = require('worker_threads');
console.log("Main thread started.");
// Create a new worker thread (requires 'worker.js' file)
const worker = new Worker('./worker.js');
// Listen for messages from the worker
worker.on('message', (msg) => {
console.log(`Worker finished: Result = ${msg}`);
});
// Listen for errors from the worker
worker.on('error', (err) => {
console.error(`Worker error: ${err}`);
});
// Listen for worker exit
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Worker stopped with exit code ${code}`);
});
// Send a heavy task to the worker
worker.postMessage(500000000); // Send a large number for heavy computation
console.log("Main thread sent task to worker.");
console.log("Main thread continues non-blocking work.");
// Simulate other work in the main thread
let mainThreadCounter = 0;
const intervalId = setInterval(() => {
console.log(`Main thread doing other work: ${mainThreadCounter++}`);
if (mainThreadCounter >= 5) {
clearInterval(intervalId);
}
}, 100);Semak Pemahaman Anda
Pertimbangkan pelayan web Node.js. Antara operasi berikut, yang manakah paling berkemungkinan menyekat gelung peristiwa dan menjejaskan responsif pelayan?
Ulang Kaji: Mengoptimumkan Gelung Peristiwa
Syabas! Anda telah mempelajari cara memastikan gelung peristiwa Node.js berjalan lancar untuk prestasi yang optimum:
- Kenal Pasti Kod yang Menyekat: Kenal pasti tugas segerak yang menggunakan CPU secara intensif.
- Pecahkan Kerja: Gunakan
setImmediate()atauprocess.nextTick()untuk menangguhkan sebahagian daripada tugas yang panjang. - Manfaatkan Utas Pekerja: Pindahkan pengiraan berat ke utas berasingan untuk mencapai pelaksanaan selari yang sebenar.
Dengan mengelakkan gelung peristiwa daripada tersekat, aplikasi Node.js anda akan kekal responsif dan cekap walaupun di bawah beban tinggi.
Pelajari JavaScript dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 22
- Pelajaran
- 92
Soalan Lazim
Adakah pelajaran “Mengoptimumkan Gelung Peristiwa Node.js” percuma?
Ya — teks penuh “Mengoptimumkan Gelung Peristiwa Node.js” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Kem Intensif Pembangunan Backend Node.js, tingkat taraf kepada CoddyKit PRO. Kursus Kem Intensif Pembangunan Backend Node.js merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengoptimumkan Gelung Peristiwa Node.js”?
Dalami gelung peristiwa untuk mengenal pasti operasi yang menyekat dan mengoptimumkan kod tak segerak bagi prestasi yang lebih baik. Anda berlatih Kem Intensif Pembangunan Backend Node.js menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kem Intensif Pembangunan Backend Node.js?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kem Intensif Pembangunan Backend Node.js di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Mengoptimumkan Gelung Peristiwa Node.js” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kem Intensif Pembangunan Backend Node.js ini?
Ya. Setiap pelajaran Kem Intensif Pembangunan Backend Node.js menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Strategi Pencachean untuk Node.js
- Pengimbangan Beban Aplikasi Node.js
- Mengoptimumkan Gelung Peristiwa Node.js
- Pemprofilan dan Pengesanan Kebocoran Memori