Rumah > Artikel > hujung hadapan web > Temui sebab penyemak imbas dan Node.js mereka EventLoop dengan cara ini!
Artikel ini akan membolehkan anda meneroka sebab penyemak imbas dan Node.js mereka bentuk EventLoop dengan cara ini.
Event Loop ialah konsep asas JavaScript Ia mesti ditanya dalam temu bual dan sering diperkatakan dalam kehidupan seharian Tetapi pernahkah anda terfikir mengapa ada Gelung Acara dan mengapa ia direka seperti ini?
Hari ini kita akan meneroka sebabnya.
JavaScript digunakan untuk melaksanakan logik interaksi halaman web, yang melibatkan operasi dom Jika berbilang urutan beroperasi pada masa yang sama, penyegerakan dan pengecualian bersama adalah diperlukan. Pemprosesan direka bentuk untuk menjadi satu-benang untuk kesederhanaan Walau bagaimanapun, jika ia adalah satu-benang, ia akan disekat apabila menghadapi logik masa dan permintaan rangkaian. Apa yang perlu dilakukan?
Anda boleh menambah lapisan logik penjadualan. Hanya masukkan kod JS ke dalam tugasan dan letakkannya dalam baris gilir tugas, dan utas utama akan terus mengambil tugas dan melaksanakannya.
Setiap kali tugasan diambil dan dilaksanakan, timbunan panggilan baharu akan dibuat.
Antaranya, pemasa dan permintaan rangkaian sebenarnya dilaksanakan dalam urutan lain Selepas pelaksanaan, tugasan diletakkan dalam baris gilir tugasan untuk memberitahu utas utama untuk diteruskan.
Oleh kerana tugas tak segerak ini dilaksanakan dalam urutan lain, dan kemudian dimaklumkan kepada utas utama melalui baris gilir tugas, ia adalah mekanisme acara, jadi gelung ini dipanggil Gelung Acara .
Tugas tak segerak ini yang dilaksanakan dalam urutan lain termasuk pemasa (setTimeout, setInterval), pemaparan UI dan permintaan rangkaian (XHR atau fetch).
Walau bagaimanapun, Gelung Peristiwa semasa mempunyai masalah yang serius Tidak ada konsep keutamaan dan ia hanya dilaksanakan mengikut urutan jika terdapat tugasan keutamaan tinggi, ia tidak akan dilaksanakan dalam masa. Oleh itu, mekanisme lompat barisan mesti direka bentuk.
Kemudian hanya buat baris gilir tugas keutamaan tinggi Selepas setiap tugas biasa dilaksanakan, semua tugas keutamaan tinggi dilaksanakan, dan kemudian tugas biasa dilaksanakan.
Dengan mekanisme lompat giliran, tugasan berkualiti tinggi boleh dilaksanakan tepat pada masanya.
Ini ialah Gelung Acara penyemak imbas semasa.
Tugas biasa dipanggil MacroTasks (tugas makro), dan tugasan berkualiti tinggi dipanggil MicroTasks (tugas mikro).
Tugas makro termasuk: setTimeout, setInterval, requestAnimationFrame, Ajax, fetch, kod teg skrip.
Microtasks termasuk: Promise.then, MutationObserver, Object.observe.
Bagaimana untuk memahami pembahagian tugas makro dan mikro?
Pemasa dan permintaan rangkaian ialah logik tak segerak biasa yang memberitahu urutan utama selepas urutan lain selesai dijalankan, jadi semuanya adalah tugasan makro.
Tiga jenis tugasan yang berkualiti tinggi juga mudah difahami. Promise mengatur proses tak segerak, dan memanggil kemudian pada hujung tak segerak juga sangat baik.
Ini ialah reka bentuk Gelung Peristiwa dalam penyemak imbas: Mekanisme Gelung dan baris gilir Tugas direka bentuk untuk menyokong tak segerak dan menyelesaikan masalah pelaksanaan logik yang menghalang utas utama mekanisme lompat gilir Barisan gilir MicroTask direka untuk menyelesaikan masalah tinggi Masalah melaksanakan tugas yang optimum seawal mungkin.
Tetapi kemudiannya, persekitaran pelaksanaan JS bukan sahaja penyemak imbas, tetapi juga Node.js, yang juga perlu menyelesaikan masalah ini, tetapi Gelung Acara yang direka bentuknya lebih terperinci.
Nod ialah persekitaran berjalan JS baharu, yang turut menyokong logik tak segerak, termasuk pemasa, IO dan rangkaian permintaan, jelas, juga boleh dijalankan menggunakan Event Loop.
Walau bagaimanapun, Gelung Acara penyemak imbas direka untuk penyemak imbas Untuk pelayan berprestasi tinggi, reka bentuk itu masih agak kasar.
Di mana kasarnya?
Gelung Acara penyemak imbas hanya dibahagikan kepada dua tahap keutamaan, satu tugas makro dan satu lagi tugas mikro. Tetapi tiada keutamaan lagi antara tugas makro, dan tiada keutamaan lagi antara tugas mikro.
Dan tugasan makro tugasan Node.js juga mempunyai keutamaan Sebagai contoh, logik pemasa mempunyai keutamaan yang lebih tinggi daripada logik IO, kerana apabila tiba masanya, lebih awal ia lebih tepat; dan sumber rapat Keutamaan logik pemprosesan adalah sangat rendah, kerana jika ia tidak ditutup, ia akan menduduki lebih banyak sumber seperti ingatan dan mempunyai sedikit kesan.
Jadi baris gilir tugas makro dibahagikan kepada lima tahap keutamaan: Pemasa, Belum Selesai, Tinjauan Umum, Semak dan Tutup.
Terangkan lima tugas makro ini:
Panggil Balik Pemasa: Apabila tiba masanya, semakin awal pelaksanaan, semakin tepat ia, jadi ini mempunyai keutamaan tertinggi dan mudah difahami.
Panggil Balik Belum Selesai: Panggilan balik semasa mengendalikan rangkaian, IO dan pengecualian lain Sesetengah sistem *niux akan menunggu ralat dilaporkan, jadi ia mesti dikendalikan.
Panggil Balik Pungutan Suara: Memproses data IO dan sambungan rangkaian, inilah yang paling utama dikendalikan oleh pelayan.
Semak Panggilan Balik: Laksanakan panggilan balik setImmediate Cirinya ialah ini boleh dipanggil semula selepas melaksanakan IO.
Tutup Panggilan Balik: Panggilan balik yang menutup sumber Pelaksanaan tertunda tidak akan menjejaskannya dan mempunyai keutamaan yang paling rendah.
Jadi, beginilah cara Gelung Peristiwa Node.js berjalan:
Ada satu lagi perbezaan yang perlu anda berikan perhatian khusus:
Gelung Peristiwa Node.js bukan seperti penyemak imbas yang melaksanakan satu tugasan makro pada satu masa dan kemudian melaksanakan semua tugas mikro Sebaliknya, ia melaksanakan beberapa tugas makro Pemasa, kemudian melaksanakan semua mikro tugasan, dan kemudian melaksanakan beberapa tugasan mikro yang belum selesai, dan kemudian melaksanakan semua tugasan mikro Perkara yang sama berlaku untuk tugasan Makro yang tinggal. (Pembetulan: Ini adalah kes sebelum nod 11. Selepas nod 11, ia ditukar kepada setiap tugas makro yang melaksanakan semua tugas mikro)
Mengapa ini?
Malah, ia mudah difahami dari segi keutamaan:
Anggapkan keutamaan tugas makro dalam penyemak imbas ialah 1, jadi ia dilaksanakan mengikut tertib, iaitu satu tugas makro, semua A microtask, kemudian macrotask, kemudian semua microtask.
Tugas makro Node.js juga mempunyai keutamaan, jadi Gelung Peristiwa Node.js akan memperuntukkan semua tugas keutamaan semasa setiap kali selepas tugasan makro selesai, jalankan tugas mikro, dan kemudian jalankan tugas makro keutamaan seterusnya.
Iaitu, sebilangan tugas makro Pemasa, kemudian semua tugas mikro, kemudian sebilangan tugas makro Panggilan Balik Tertunda, dan kemudian semua tugas mikro.
Mengapa ia dikatakan sebagai jumlah tertentu?
Oleh kerana jika terdapat terlalu banyak tugasan makro dalam peringkat tertentu, peringkat seterusnya tidak akan pernah dilaksanakan, jadi terdapat had atas, dan Gelung Peristiwa seterusnya yang selebihnya akan terus dilaksanakan.
Selain keutamaan tugas makro, tugas mikro juga dibahagikan kepada keutamaan Terdapat tugas mikro keutamaan tinggi tambahan proses.nextTick, yang dijalankan sebelum semua tugas mikro biasa.
Jadi, proses lengkap Node.js Event Loop adalah seperti ini:
Mengubah cara melaksanakan satu tugasan makro pada satu masa dalam Gelung Peristiwa penyemak imbas, yang membolehkan tugasan makro keutamaan tinggi dilaksanakan lebih awal, tetapi juga menetapkan had atas untuk menghalang peringkat seterusnya daripada tidak dilaksanakan.
Ada satu lagi perkara yang perlu diberi perhatian khusus iaitu peringkat undian: Jika ia dilaksanakan ke peringkat undian dan didapati baris gilir undian kosong dan tiada tugasan yang perlu dibuat. dilaksanakan dalam baris gilir pemasa dan semak baris gilir, kemudian ia akan disekat dan tunggu acara IO di sini dan bukannya melahu. Reka bentuk ini juga kerana pelayan terutamanya mengendalikan IO, dan menyekat di sini boleh bertindak balas kepada IO lebih awal.
Gelung Peristiwa Node.js yang lengkap adalah seperti ini:
Bandingkan Gelung Peristiwa penyemak imbas:
Idea reka bentuk keseluruhan bagi Gelung Peristiwa bagi kedua-dua persekitaran larian JS adalah serupa, kecuali Gelung Peristiwa Node.js mempunyai pembahagian tugas makro dan tugas mikro yang lebih terperinci, yang juga mudah difahami. Lagipun, Persekitaran Node untuk .js berbeza daripada pelayar Lebih penting lagi, keperluan prestasi pelayan akan lebih tinggi.
JavaScript pertama kali digunakan untuk menulis logik interaksi halaman web Untuk mengelakkan masalah penyegerakan berbilang urutan mengubah suai dom pada masa yang sama direka bentuk untuk menjadi satu-benang. Untuk menyelesaikan masalah penyekatan satu-benang, satu lapisan logik penjadualan ditambah, iaitu, gelung gelung dan giliran Tugas, dan logik penyekat dimasukkan ke dalam utas lain untuk dijalankan, sekali gus menyokong operasi tak segerak. Kemudian untuk menyokong penjadualan tugas keutamaan tinggi, baris gilir tugas mikro diperkenalkan Ini ialah mekanisme Gelung Peristiwa pelayar: laksanakan satu tugasan makro pada satu masa, dan kemudian laksanakan semua tugasan mikro.
Node.js juga merupakan persekitaran berjalan JS Jika anda ingin menyokong tak segerak, anda juga perlu menggunakan Gelung Acara Walau bagaimanapun, persekitaran pelayan lebih kompleks dan mempunyai keperluan prestasi yang lebih tinggi, jadi Node .js mempunyai kedua-dua tugasan makro dan mikro Bahagian keutamaan yang lebih terperinci telah dibuat: Node.js dibahagikan kepada 5 jenis tugasan makro, iaitu Pemasa, Menunggu, Tinjauan, Semak dan Tutup. Dua jenis microtasks dibahagikan iaitu process.nextTick microtasks dan microtasks lain.Proses Gelung Peristiwa Node.js adalah untuk melaksanakan sebilangan tugas makro dalam peringkat semasa (selebihnya akan dilaksanakan dalam gelung seterusnya), dan kemudian melaksanakan semua tugasan mikro di sana ialah Pemasa, Menunggu, Melahu/ Sediakan, Tinjauan, Semak, Tutup 6 peringkat. (Pembetulan: Ini adalah kes sebelum nod 11. Selepas nod 11, ia ditukar kepada setiap tugas makro yang melaksanakan semua tugas mikro)
Peringkat Idle/Prepare digunakan secara dalaman oleh Node.js, jadi jangan risau.Perhatian khusus harus diberikan kepada fasa Tinjauan Jika baris gilir undian kosong dan pemasa dan baris gilir semak juga kosong, ia akan disekat di sini menunggu IO sehingga terdapat panggilan balik dalam. pemasa dan semak baris gilir Teruskan gelung sekali lagi.
Event Loop ialah satu set logik penjadualan yang direka oleh JS untuk menyokong tak segerak dan keutamaan tugasan Ia mempunyai reka bentuk berbeza untuk persekitaran yang berbeza seperti pelayar dan Node.js (terutamanya pembahagian keutamaan tugas) (. butiran yang berbeza), Node.js menghadapi persekitaran yang lebih kompleks dan mempunyai keperluan prestasi yang lebih tinggi, jadi reka bentuk Gelung Acara adalah lebih kompleks. Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:tutorial nodejs! !
Atas ialah kandungan terperinci Temui sebab penyemak imbas dan Node.js mereka EventLoop dengan cara ini!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!