Jadual Kandungan
libuv
Soalan
gelung peristiwa dalam nodeJs
pemasa
tinjauan pendapat
semak
小总结
案例
了解下浏览器和node的event-loop差异在什么地方
关于 process.nextTick()和setImmediate
process.nextTick()
event-loop核心思维导图
结束语
Rumah hujung hadapan web tutorial js Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Nov 05, 2021 am 09:48 AM
node.js

Artikel ini akan membawa anda melalui mekanisme gelung peristiwa (gelung masa) dalam Node.js saya harap ia akan membantu anda.

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Hari ini kita akan belajar tentang gelung peristiwa dalam nodeJs. Pemahaman tentang event-loop sentiasa menjadi kesukaran yang besar bagi saya. Saya berharap dapat menempuhi kesulitan ini melalui kajian ini.

libuv

Sebelum mempelajari gelung peristiwa, fahami dahulu libuv nod. libuv bertanggungjawab untuk pelaksanaan model I/O yang berbeza pada sistem pengendalian yang berbeza dan mengabstrakkan pelaksanaan yang berbeza ke dalam API yang boleh digunakan pada aplikasi pihak ketiga.

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Soalan

Sebelum secara formal mempelajari acara-gelung, fikirkan soalan dahulu

    setTimeout(() => {
      console.log("timer1");
      Promise.resolve().then(() => {
        console.log("promise1");
      });
    }, 0);

    setTimeout(() => {
      console.log("timer2");
      Promise.resolve().then(() => {
        console.log("promise2");
      });
    }, 0);
Salin selepas log masuk

Ini Apakah hasil menjalankan kod ini dalam penyemak imbas?

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Apakah hasil menjalankannya dalam nod?

Sebelum nod8.6:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Selepas nod8.6:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Mengapa ada keputusan sedemikian, kami akan menganalisisnya kemudian!

gelung peristiwa dalam nodeJs

Pertama sekali , Mari lihat gambar:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Anda boleh melihat 6 peringkat dalam gambar, iaitu: pemasa, panggilan balik belum selesai, melahu/sediakan, tinjauan pendapat, semak, tutup panggilan balik.

  • fasa pemasa: terutamanya melaksanakan setTimeOut, setInterval panggil balik

  • fasa panggil balik belum selesai: laksanakan beberapa ralat panggilan sistem, seperti Ralat komunikasi rangkaian panggil balik

  • fasa melahu/menyediakan: hanya digunakan dalam sistem (kami tidak boleh mengawal dan mengganggu fasa ini)

  • fasa undian: dapatkan I/ O peristiwa, seperti mendapatkan panggilan balik I/O untuk membaca fail. Dalam keadaan yang sesuai, nodej akan menyekat dalam fasa ini

  • fasa semak: laksanakan setPanggil balik segera

  • Contohnya Laksanakan musnahkan dan tutup panggilan balik acara sokect

Setiap peringkat mengikut peraturan FIFO (Mula-mula masuk dahulu) untuk melaksanakan tugas baris gilir tugas di dalam . Antara enam peringkat ini, kita perlu menumpukan pada peringkat pemasa, tinjauan pendapat, semak. Kebanyakan tugas tak segerak dalam pembangunan harian kita dikendalikan dalam tiga peringkat ini.

pemasa

Mari kita bincangkan tentang peringkat pemasa dahulu.
Pemasa ialah peringkat pertama gelung acara Nodejs akan menyemak sama ada terdapat pemasa tamat tempoh, dan jika ya, masukkan panggilan baliknya ke dalam baris gilir. Walau bagaimanapun, nodejs tidak boleh menjamin bahawa pemasa akan melaksanakan panggilan balik dengan serta-merta apabila acara pratetap tiba Ini kerana semakan tamat tempoh pemasa oleh nodejs tidak semestinya boleh dipercayai menghadapi situasi utama semasa.
Mengenai ketidakpastian di sini, tapak web rasmi memberikan contoh:
Mula-mula mengisytiharkan setTimeOut, dan kemudian membaca fail secara luaran Apabila operasi membaca fail melebihi masa pemasa, operasi Fail baca akan melambatkan panggilan balik pemasa Ini adalah keadaan di mana utas utama tidak terbiar seperti yang dinyatakan sebelum ini.

tinjauan pendapat

Fasa tinjauan pendapat terutamanya melaksanakan dua perkara:

1 Memproses baris gilir tugasan fasa tinjauan pendapat

2 . Apabila terdapat pemasa yang telah tamat masa, fungsi panggil baliknya dilaksanakan

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

Dalam rajah di atas, kita juga boleh melihat: Selepas melaksanakan baris gilir tugas tinjauan pendapat dalam fasa tinjauan Selepas tugas, ia akan menyemak sama ada terdapat set pratetapSegera Jika ada, ia akan memasuki fasa semak Jika tidak, nodejs akan menyekat di sini.

Di sini kita akan mempunyai soalan Jika ia disekat dalam peringkat tinjauan pendapat, bukankah pemasa yang kita tetapkan tidak boleh dilaksanakan?
MalahApabila gelung acara disekat dalam fasa tinjauan pendapat, nodej akan mempunyai mekanisme semakan Ia akan menyemak sama ada baris gilir pemasa kosong, ia akan memasuki semula pemasa fasa.

semak

Fungsi panggil balik utama setImmediate dilaksanakan semasa fasa semakan.

小总结

event-loop的每个阶段都有一个队列,当event-loop达到某个阶段之后,将执行这个阶段的任务队列,直到队列清空或者达到系统规定的最大回调限制之后,才会进入下一个阶段。当所有阶段都执行完成一次之后,称event-loop完成一个tick。

案例

上面我们说完了event-loop的理论部分,但是光有理论我们也还是不能很清晰的理解event-loop。下面我们就根据几个demo来更加深入的理解下event-loop!

demo1

    const fs=require('fs')
    fs.readFile('test.txt',()=>{
            console.log('readFile')
            setTimeout(()=>{
                    console.log('settimeout');
            },0)
            setImmediate(()=>{
                    console.log('setImmediate')
            })
    })
Salin selepas log masuk

执行结果:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

可见执行结果跟我们前面的分析时一致的!

demo2

    const fs = require("fs");
    const EventEmitter = require("events").EventEmitter;
    let pos = 0;
    const messenger = new EventEmitter();

    messenger.on("message", function (msg) {
      console.log(++pos + " message:" + msg); //
    });

    console.log(++pos + " first"); //

    process.nextTick(function () {
      console.log(++pos + " nextTick"); //
    });

    messenger.emit("message", "hello!");
    fs.stat(__filename, function () {
      console.log(++pos + " stat"); //
    });

    setTimeout(function () {
      console.log(++pos + " quick timer"); //
    }, 0);
    setTimeout(function () {
      console.log(++pos + " long timer"); //
    }, 30);
    setImmediate(function () {
      console.log(++pos + " immediate"); //
    });

    console.log(++pos + " last"); //
Salin selepas log masuk

结果:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

了解下浏览器和node的event-loop差异在什么地方

在node 8.6 之前:

浏览器中的微任务队列会在每个宏任务执行完成之后执行,而node中的微任务会在事件循环的各个阶段之间执行,即每个阶段执行完成之后会去执行微任务队列。

在8.6之后:

浏览器和node中微任务的执行是一致的!

所以,在文章开头,我们提出的思考的问题就有了结果。

关于 process.nextTick()和setImmediate

process.nextTick()

语法:process.nextTick(callback,agrs)

执行时机:

这个函数其实是独立于 Event Loop 之外的,它有一个自己的队列,当每个阶段完成后,如果存在 nextTick 队列,就会清空队列中的所有回调函数,并且优先于其他 microtask 执行。递归的调用process.nextTick()会导致I/O starving,官方推荐使用setImmediate()

关于starving现象的说明:

    const fs = require("fs");
    fs.readFile("test.txt", (err, msg) => {
      console.log("readFile");
    });

    let index = 0;

    function handler() {
      if (index >= 30) return;
      index++;
      console.log("nextTick" + index);
      process.nextTick(handler);
    }

    handler();
Salin selepas log masuk

运行结果:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

可以看到,等到nextTick函数呗执行30次之后,读取文件的回调才被执行!这样的现象被称为 I/O 饥饿

当我们把 process.nextTick 换为 setImmediate

    const fs = require("fs");
    fs.readFile("test.txt", (err, msg) => {
      console.log("readFile");
    });

    let index = 0;

    function handler() {
      if (index >= 30) return;
      index++;
      console.log("nextTick" + index);
      setImmediate(handler);
    }

    handler();
Salin selepas log masuk

结果:

Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

造成这两种差异的原因是,嵌套调用的setImmediate的回调被排到了下一次event-loop中去!

event-loop核心思维导图

1Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

结束语

通过今天的学习,让我对event-loop的理解更深刻了。那么,下次见。好好学习,天天向上!

1Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js

更多编程相关知识,请访问:编程视频!!

Atas ialah kandungan terperinci Artikel untuk bercakap tentang mekanisme gelung peristiwa dalam Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Artikel tentang kawalan memori dalam Node Artikel tentang kawalan memori dalam Node Apr 26, 2023 pm 05:37 PM

Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Mar 29, 2023 pm 06:02 PM

Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Mari bercakap secara mendalam tentang modul Fail dalam Node Mari bercakap secara mendalam tentang modul Fail dalam Node Apr 24, 2023 pm 05:49 PM

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Dec 13, 2022 pm 08:00 PM

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Nov 16, 2022 pm 08:34 PM

Node 19 telah dikeluarkan secara rasmi Artikel ini akan memberi anda penjelasan terperinci tentang 6 ciri utama Node.js 19. Saya harap ia akan membantu anda!

Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js Nov 29, 2022 pm 08:44 PM

Bagaimanakah Node.js melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.

Mari kita bincangkan tentang gelung acara dalam Node Mari kita bincangkan tentang gelung acara dalam Node Apr 11, 2023 pm 07:08 PM

Gelung peristiwa ialah bahagian asas Node.js dan mendayakan pengaturcaraan tak segerak dengan memastikan bahawa utas utama tidak disekat Memahami gelung peristiwa adalah penting untuk membina aplikasi yang cekap. Artikel berikut akan memberi anda pemahaman yang mendalam tentang gelung acara dalam Node.

Apakah yang perlu saya lakukan jika nod tidak boleh menggunakan arahan npm? Apakah yang perlu saya lakukan jika nod tidak boleh menggunakan arahan npm? Feb 08, 2023 am 10:09 AM

Sebab mengapa nod tidak boleh menggunakan arahan npm adalah kerana pembolehubah persekitaran tidak dikonfigurasikan dengan betul Penyelesaiannya ialah: 1. Buka "Sistem Sifat"; 2. Cari "Pembolehubah Persekitaran" -> "Pembolehubah Sistem", dan kemudian edit persekitaran. pembolehubah; 3. Cari lokasi folder nodejs;

See all articles