Rumah > Artikel > hujung hadapan web > Barisan acara node.js mempunyai beberapa peringkat
Baris gilir acara node.js mempunyai 6 peringkat: 1. Peringkat "pemasa"; , peringkat "semak"; 6. peringkat "tutup panggilan balik".
Persekitaran pengendalian tutorial ini: sistem Windows 7, nodejs versi 12.19.0, komputer DELL G3.
Baris gilir acara dalam Node agak berbeza daripada dalam penyemak imbas, tetapi perkara biasa ialah mekanisme tugas makro dan tugas mikro adalah sama. Gambar di bawah menunjukkan tugas makro dan tugas mikro nod .
nexttick akan dilaksanakan dahulu apabila setiap acara nod dibuka (keutamaan tertinggi tugasan mikro).
Baris gilir acara nod boleh dibahagikan kepada 6 peringkat berikut:
Peringkat pemasa: Peringkat ini melaksanakan pemasa (setTimeout, setInterval ) panggil balik
2. Peringkat panggilan balik I/O: laksanakan beberapa ralat panggilan sistem, seperti panggilan balik ralat komunikasi rangkaian
3 melahu, peringkat sediakan: hanya digunakan secara dalaman oleh nod
4. Fasa Tinjauan: Dapatkan acara I/O baharu Di bawah keadaan yang sesuai, nod akan menyekat di sini
5. Lakukan panggilan balik setImmediate()
6 peringkat: Laksanakan panggilan balik acara tutup soket
Mari fokus pada tiga peringkat pemasa, tinjauan pendapat dan semak, kerana kebanyakan tugas tak segerak dalam pembangunan harian diproses dalam tiga peringkat ini.
fasa pemasa
pemasa ialah fasa pertama gelung acara Nod akan menyemak sama ada terdapat pemasa tamat tempoh, dan jika ya, sekat panggilan baliknya baris gilir tugas pemasa untuk menunggu pelaksanaan Sebenarnya, Node tidak dapat menjamin bahawa pemasa akan dilaksanakan dengan serta-merta apabila masa pratetap dicapai, kerana semakan tamat tempoh Node tidak semestinya boleh dipercayai, dan ia akan dipengaruhi oleh program lain yang sedang berjalan pada. mesin, atau Benang utama tidak melahu pada masa itu. Sebagai contoh, dalam kod berikut, susunan pelaksanaan setTimeout() dan setImmediate() adalah tidak pasti.
setTimeout(() => { console.log('timeout')}, 0)setImmediate(() => { console.log('immediate')})
Kod di atas adalah perangkap besar Nod tidak boleh menentukan masa tertentu apabila baris gilir acara ditetapkan setiap kali Ini mungkin 5ms kali ini (pemasa ditolak ke timbunan dan tidak akan dilaksanakan sehingga pusingan kedua. Kali seterusnya ialah 1ms (pemasa ditangkap dan dilaksanakan pada pusingan pertama). Oleh itu, susunan keputusan keluaran adalah tidak pasti, yang juga merupakan sebab khusus Apabila operasi tak segerak disarang dan dibalut, ia adalah 100% dijamin bahawa segera akan dilaksanakan terlebih dahulu.
fs.readFile('./index.html',(err,result)=>{ setTimeout(() => { console.log('timeout') }, 0) setImmediate(() => { console.log('immediate') })})
Ini kerana pemasa tidak ditangkap pada pusingan pertama, jadi ia pergi terus ke fasa tinjauan untuk menangkap panggilan balik io Apabila io tamat dan memasuki fasa semakan, serta-merta akan dilaksanakan , dan tamat masa akan berada dalam Pemasa pada permulaan pusingan kedua dilaksanakan.
fasa undian
Fasa tinjauan pendapat terutamanya mempunyai 2 fungsi:
1. Memproses acara dalam baris gilir undian
2. Apabila terdapat pemasa yang telah tamat tempoh, Melaksanakan fungsi panggil balik
gelung genap akan melaksanakan panggilan balik secara serentak dalam baris gilir tinjauan pendapat sehingga baris gilir kosong atau panggilan balik yang dilaksanakan mencapai had atas sistem (had atas tidak diketahui), kemudian gelung genap akan menyemak sama ada terdapat pra-emption Terdapat dua situasi untuk setImmediate():
1 Jika terdapat set pratetapImmediate(), gelung acara akan menamatkan fasa tinjauan dan memasuki fasa semak, dan laksanakan baris gilir tugasan fasa semakan
2. Jika tiada set pratetapImmediate(), gelung acara akan disekat dalam peringkat ini dan tunggu
Perhatikan satu butiran Tanpa setImmediate(), acara tersebut gelung akan disekat dalam peringkat tinjauan, jadi pemasa yang ditetapkan sebelum ini tidak akan dapat dilaksanakan ? Oleh itu, semasa fasa tinjauan, gelung acara akan mempunyai mekanisme semakan untuk menyemak sama ada baris gilir pemasa kosong Jika baris gilir pemasa tidak kosong, gelung acara akan memulakan pusingan seterusnya gelung acara, iaitu, masukkan semula fasa pemasa.
fasa semak
Panggil balik setImmediate() akan ditambah pada baris gilir semakan Daripada rajah fasa gelung peristiwa, kita boleh tahu bahawa susunan pelaksanaan bagi fasa semak adalah selepas fasa undian.
Ringkasan
Nod Setiap gelung peristiwa besar dibahagikan kepada enam babak, setiap Senario perlu dilaksanakan mengikut urutan , yang lebih terperinci daripada penyemak imbas, dan tugas makro dan tugas mikro diproses pada setiap peringkat, yang merupakan titik khas.
1. Gelung peristiwa Node.js dibahagikan kepada 6 peringkat
2 Masa pelaksanaan baris gilir tugasan mikro adalah berbeza dalam pelayar dan persekitaran Nod
Dalam Node.js, microtask dilaksanakan antara pelbagai peringkat gelung acara
Di sisi penyemak imbas, microtask dilaksanakan selepas makrotugas gelung acara dilaksanakan
3. Proses panggilan rekursif .nextTick() akan menyebabkan I/O kelaparan Secara rasminya disyorkan untuk menggunakan setImmediate()
4. Nexttick mempunyai keutamaan tertinggi antara tugasan mikro dalam setiap peringkat acara.
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs! !
Atas ialah kandungan terperinci Barisan acara node.js mempunyai beberapa peringkat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!