Rumah >hujung hadapan web >tutorial js >Node JS - Gelung Acara

Node JS - Gelung Acara

Susan Sarandon
Susan Sarandonasal
2024-11-20 19:03:16472semak imbas

Node JS - The Event Loop

Kami telah membincangkan mengapa Node JS adalah satu-benang dan juga berbilang benang dalam artikel kami yang dipanggil "Node Dalaman". Ia akan memberi anda asas yang kukuh pada seni bina Node dan menetapkan peringkat untuk memahami keajaiban Gelung Acara!

Nod js boleh dianggap sebagai satu-benang kerana Gelung Peristiwa. Tetapi, apakah gelung acara?

Saya sentiasa bermula dengan analogi restoran kerana saya fikir ia menjadi mudah untuk memahami butiran teknikal.

Jadi, Chef utama di restoran mengambil pesanan daripada senarai pesanan dan memberikannya kepada pasukan pembantu. Apabila makanan sudah siap, chef menghidangkan makanan. Jika ada pelanggan VIP datang maka chef utamakan tempahan ini.

Jika kita mengambil analogi ini sebagai pertimbangan kita maka kita boleh mengatakan bahawa...

Dalam konteks Gelung Acara Node JS.

  • Chef ialah Gelung Acara yang mengurus tugas dan mengagihkan kerja.

  • Pasukan Bantuan ialah rangkaian pekerja atau OS yang mengendalikan pelaksanaan tugas yang diwakilkan kepada mereka.

  • Senarai Pesanan ialah baris gilir tugasan untuk tugasan yang menunggu giliran.

  • Pelanggan VIP ialah Microtask yang mempunyai keutamaan tinggi dan diselesaikan sebelum tugas biasa.

Untuk, Memahami Gelung Peristiwa, kita perlu terlebih dahulu memahami perbezaan antara Tugasan Mikro dan Tugasan Makro.

Tugasan mikro

Microtask bermaksud tugasan yang mempunyai keutamaan tinggi dan dilaksanakan selepas kod Javascript yang sedang dilaksanakan selesai, tetapi sebelum beralih ke fasa seterusnya Gelung Acara.

Contoh:

  • proses.Tick seterusnya
  • Janji (.kemudian, .tangkap, .akhirnya)
  • gilirMicrotask

Tugasan makro

Ini adalah tugas-tugas keutamaan yang lebih rendah yang beratur untuk pelaksanaan pada fasa kemudian dalam Gelung Acara.

Contoh:

  • setTimeout
  • setInterval
  • setImmediate
  • Operasi I/O

Gelung Peristiwa

Apabila kami menjalankan tugas tak segerak dalam Node.js, Gelung Peristiwa adalah teras kepada segala-galanya.

Terima kasih kepada Event Loop, Node.js boleh melaksanakan operasi I/O tanpa sekatan dengan cekap. Ia mencapai ini dengan menyerahkan tugas yang memakan masa kepada sistem pengendalian atau rangkaian pekerja. Setelah tugasan selesai, panggilan balik mereka diproses secara teratur, memastikan pelaksanaan lancar tanpa menyekat urutan utama.

Inilah keajaiban yang membolehkan Node.js mengendalikan berbilang tugas secara serentak sementara masih berbenang tunggal.

Fasa-fasa

Terdapat enam fasa dalam Gelung Acara dan setiap fasa mempunyai baris gilir sendiri, yang memegang jenis tugasan tertentu.

1.Fasa Pemasa

Dalam fasa ini panggilan balik berkaitan pemasa dikendalikan seperti setTimeout dan setInterval.

Node js menyemak baris gilir pemasa untuk panggilan balik yang kelewatannya telah tamat tempoh.

Jika kelewatan pemasa dicapai, panggilan baliknya ditambahkan pada baris gilir ini untuk pelaksanaan.

console.log('Start');

setTimeout(() => {
  console.log('Timer 1 executed after 1 second');
}, 1000);

setTimeout(() => {
  console.log('Timer 2 executed after 0.5 seconds');
}, 500);

let count = 0;
const intervalId = setInterval(() => {
  console.log('Interval callback executed');
  count++;

  if (count === 3) {
    clearInterval(intervalId);
    console.log('Interval cleared');
  }
}, 1000);

console.log('End');

Output:

Start
End
Timer 2 executed after 0.5 seconds
Timer 1 executed after 1 second
Interval callback executed
Interval callback executed
Interval callback executed
Interval cleared

Fasa panggil balik 2.I/O

Tujuan fasa ini adalah untuk melaksanakan panggilan balik untuk operasi I/O (Input/Output) yang lengkap, seperti membaca atau menulis fail, menanya pangkalan data, mengendalikan permintaan rangkaian dan tugas I/O tak segerak yang lain.

Apabila anda datang sebarang operasi I/O tak segerak dalam Node.js (seperti membaca fail menggunakan fs.readFile), operasi itu diwakilkan kepada sistem pengendalian atau rangkaian pekerja. Tugas I/O ini dilaksanakan di luar utas utama dengan cara yang tidak menyekat. Setelah tugas selesai, fungsi panggil balik dicetuskan untuk memproses keputusan.

Fasa Panggilan Balik I/O ialah tempat panggilan balik ini dibariskan untuk pelaksanaan sebaik sahaja operasi selesai.

const fs = require('fs');

console.log('Start');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file:', err);
    return;
  }
  console.log('File contents:', data);
});

console.log('Middle');

setTimeout(() => {
  console.log('Simulated network request completed');
}, 0);

console.log('End');

Output

Start
Middle
End
Simulated network request completed
File contents: (contents of the example.txt file)

3.Fasa terbiar

Dalam fasa ini, tiada kerja yang ditentukan pengguna dilakukan sebaliknya dalam gelung peristiwa fasa ini bersedia untuk fasa seterusnya. hanya pelarasan dalaman dilakukan dalam fasa ini.

4.Fasa tinjauan pendapat

Fasa Undian menyemak sama ada terdapat acara I/O yang belum selesai (seperti aktiviti rangkaian atau acara sistem fail) yang perlu diproses. Ia akan segera melaksanakan panggilan balik yang dikaitkan dengan acara ini.

Jika tiada acara I/O belum selesai, Fasa Tinjauan boleh memasuki keadaan menyekat.

Dalam keadaan menyekat ini, Node.js hanya akan menunggu acara I/O baharu tiba. Keadaan menyekat inilah yang menjadikan Node.js tidak menyekat: Ia menunggu sehingga peristiwa I/O baharu mencetuskan pelaksanaan panggil balik, memastikan urutan utama bebas untuk tugasan lain sementara itu.

Sebarang panggilan balik untuk operasi I/O yang lengkap (seperti fs.readFile, permintaan HTTP atau pertanyaan pangkalan data) dilaksanakan semasa fasa ini. Operasi I/O ini mungkin telah dimulakan dalam fasa sebelumnya (seperti Fasa Pemasa atau Fasa Panggilan Balik I/O) dan kini telah selesai.

Jika terdapat pemasa ditetapkan dengan setTimeout atau setInterval, Node.js akan menyemak sama ada mana-mana pemasa telah tamat tempoh dan jika panggilan balik yang berkaitan perlu dilaksanakan. Jika pemasa telah tamat tempoh, panggilan balik mereka dialihkan ke baris gilir panggil balik, tetapi ia tidak akan diproses sehingga fasa seterusnya, iaitu Fasa Pemasa.

const fs = require('fs');
const https = require('https');

console.log('Start');

fs.readFile('file1.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file1:', err);
    return;
  }
  console.log('File1 content:', data);
});

fs.readFile('file2.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file2:', err);
    return;
  }
  console.log('File2 content:', data);
});

https.get('https://jsonplaceholder.typicode.com/todos/1', (response) => {
  let data = '';
  response.on('data', (chunk) => {
    data += chunk;
  });
  response.on('end', () => {
    console.log('HTTP Response:', data);
  });
});

console.log('End');

Output:

Start
End
File1 content: (contents of file1.txt)
File2 content: (contents of file2.txt)
HTTP Response: (JSON data from the HTTP request)

5.Semak fasa

Selepas Fasa Undian telah menyelesaikan tugasnya. Fasa ini terutamanya mengendalikan pelaksanaan panggilan balik setImmediate, yang dijadualkan untuk dijalankan serta-merta selepas acara I/O diproses dalam Fasa Tinjauan.

setPanggil balik segera sering digunakan apabila anda ingin melakukan tindakan selepas kitaran gelung peristiwa semasa, seperti memastikan beberapa tugasan dilaksanakan selepas sistem tidak sibuk memproses acara I/O.

Fasa Semak mempunyai keutamaan yang lebih tinggi berbanding Fasa Pemasa (yang mengendalikan setTimeout dan setInterval). Ini bermakna setPanggil balik segera akan sentiasa dilaksanakan sebelum mana-mana pemasa walaupun pemasanya telah tamat tempoh.

setImmediate menjamin bahawa panggilan baliknya akan dijalankan selepas kitaran I/O semasa dan sebelum kitaran pemasa seterusnya. Ini boleh menjadi penting apabila anda ingin memastikan bahawa tugasan berkaitan I/O diselesaikan terlebih dahulu sebelum menjalankan tugas lain.

console.log('Start');

setTimeout(() => {
  console.log('Timer 1 executed after 1 second');
}, 1000);

setTimeout(() => {
  console.log('Timer 2 executed after 0.5 seconds');
}, 500);

let count = 0;
const intervalId = setInterval(() => {
  console.log('Interval callback executed');
  count++;

  if (count === 3) {
    clearInterval(intervalId);
    console.log('Interval cleared');
  }
}, 1000);

console.log('End');

Output:

Start
End
Timer 2 executed after 0.5 seconds
Timer 1 executed after 1 second
Interval callback executed
Interval callback executed
Interval callback executed
Interval cleared

6.fasa tutup

Fasa Tutup Panggilan Balik biasanya dilaksanakan apabila aplikasi perlu dibersihkan sebelum keluar atau ditutup.

Fasa ini berurusan dengan acara dan tugasan yang perlu dilaksanakan sebaik sahaja sumber sistem, seperti soket rangkaian atau pemegang fail, tidak diperlukan lagi.

Tanpa fasa ini, aplikasi mungkin membiarkan pemegang fail terbuka, sambungan rangkaian atau sumber lain, yang berpotensi membawa kepada kebocoran memori, kerosakan data atau isu lain.

const fs = require('fs');

console.log('Start');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file:', err);
    return;
  }
  console.log('File contents:', data);
});

console.log('Middle');

setTimeout(() => {
  console.log('Simulated network request completed');
}, 0);

console.log('End');

Output:

Start
Middle
End
Simulated network request completed
File contents: (contents of the example.txt file)

Terdapat satu lagi fasa istimewa dalam Gelung Peristiwa Node JS.

Baris Gilir Tugasan Mikro

process.nextTick() dan berjanji untuk melaksanakan panggilan balik mereka dalam fasa khas dalam Gelung Acara.

process.nextTick() menjadualkan panggilan balik untuk dilaksanakan serta-merta selepas operasi semasa selesai, tetapi sebelum gelung acara diteruskan ke fasa seterusnya.

process.nextTick() bukan sebahagian daripada mana-mana fasa dalam gelung acara. Sebaliknya, ia mempunyai baris gilir dalaman sendiri yang dapat dilaksanakan sejurus selepas kod segerak yang sedang dilaksanakan dan sebelum sebarang fasa dalam gelung acara dimasukkan.

Ia dilaksanakan selepas operasi semasa tetapi sebelum I/O, setTimeout atau tugas lain yang dijadualkan dalam gelung acara.

Janji mempunyai keutamaan yang lebih rendah daripada process.nextTick() dan diproses selepas semua panggil balik process.nextTick().

const fs = require('fs');
const https = require('https');

console.log('Start');

fs.readFile('file1.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file1:', err);
    return;
  }
  console.log('File1 content:', data);
});

fs.readFile('file2.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('Error reading file2:', err);
    return;
  }
  console.log('File2 content:', data);
});

https.get('https://jsonplaceholder.typicode.com/todos/1', (response) => {
  let data = '';
  response.on('data', (chunk) => {
    data += chunk;
  });
  response.on('end', () => {
    console.log('HTTP Response:', data);
  });
});

console.log('End');

Output:

Start
End
File1 content: (contents of file1.txt)
File2 content: (contents of file2.txt)
HTTP Response: (JSON data from the HTTP request)

Kini, Anda mempunyai idea keseluruhan tentang cara Gelung Acara berfungsi.

Saya memberi anda satu soalan yang mana jawapan anda boleh berikan dalam ulasan.

const fs = require('fs');

console.log('Start');

fs.readFile('somefile.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('File content:', data);
});

setImmediate(() => {
  console.log('Immediate callback executed');
});

setTimeout(() => {
  console.log('Timeout callback executed');
}, 0);

console.log('End');

Terima kasih.

Menunggu jawapan anda.

Atas ialah kandungan terperinci Node JS - Gelung Acara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn