Rumah >hujung hadapan web >tutorial js >Teknik klasik: single-threading dan JavaScript tak segerak
Artikel ini membawakan anda pengetahuan yang berkaitan tentang single-threading dan asynchronousness dalam JavaScript saya harap ia akan membantu anda.
Semasa saya menulis artikel ini, saya juga membaca banyak artikel, tetapi kebanyakannya sangat mudah dan perkara-perkara konsepnya sangat kabur, jadi saya mencari saya mendengar beberapa kursus dan mengambil beberapa nota. Saya akan merumuskannya secara ringkas di sini untuk semakan masa hadapan~
1. Proses : Setelah program dilaksanakan, ia menduduki ruang memori unik ---- anda boleh melihat proses melalui Windows Task Manager; Thread
: Ia adalahbebas unit pelaksanaan dalam proses; ia adalah proses lengkap pelaksanaan program;
3. Hubungan antara proses dan utas: * Secara amnya terdapat sekurang-kurangnya satu utas berjalan dalam proses: Urut utama
-- selepas proses dimulakan Secara automatik dibuat;* Berbilang utas juga boleh dijalankan dalam satu proses pada masa yang sama * Data dalam satu proses boleh Untuk berbilang rangkaian untuk dikongsi secara langsung; * Data antara berbilang proses tidak boleh dikongsi secara langsung
4 * Ada yang proses tunggal
* firefox* Ada yang berbilang proses
* chrome5. Bagaimana untuk semak sama ada penyemak imbas berbilang proses Apakah proses yang sedang berjalan?
* Pengurus Tugas==> Proses 6 penyemak imbas menjalankan berbilang benang atau tidak?* Semua dijalankan dalam berbilang benang
Berbilang benang
1. Apa itu single-threadedCiri utama bahasa JavaScript ialah ia adalah single-thread, yang bermaksud bahawa ia hanya boleh melakukan satu perkara pada masa yang sama. 2. Mengapa JavaScript berbenang tunggalPertama sekali, ini adalah sebab sejarah apabila bahasa JavaScript dicipta, berbilang proses dan berbilang benang seni bina tidak popular dan perkakasan Sokongannya tidak bagus.
Kedua, disebabkan kerumitan multi-threading, operasi multi-threading memerlukan penguncian, dan kerumitan pengekodan akan meningkat.
Penyegerakan dan tak segerak
//栗子 console.log(1) console.log(2) console.log(3) //输出顺序 1 2 3
tindanan pelaksanaan
(tindanan konteks pelaksanaan)." (baris gilir tugasan ), apabila tugas asynchronous selesai, ia akan dimasukkan ke dalam baris gilir tugas dalam bentuk fungsi panggil balik untuk menunggu Apabila utas utama melahu, utas utama akan pergi ke baris gilir acara keluarkan fungsi panggil balik menunggu dan masukkan ke dalam utas utama yang dilaksanakan. Proses ini dilaksanakan berulang kali untuk membentuk mekanisme gelung acara (Gelung Acara) js. 2. Mengapa JavaScript perlu tidak segerak
Jika semasa pelaksanaan kod JS, sekeping kod tertentu dilaksanakan terlalu lama, kod berikutnya tidak akan dilaksanakan untuk lama, mengakibatkanmenyekat (iaitu tersekat), yang akan menjejaskan pengalaman pengguna.
3. Bagaimana untuk melaksanakan JavaScript tak segerak1) Timbunan pelaksanaan dan baris gilir tugas Malah, kami telah menyatakan di atas bahawa JS melaksanakan tak segerak melalui gelung peristiwa ;Mari kita fahami beberapa konsep dahulu:
当一个JS文件第一次执行的时候,js引擎会 解析这段代码,并将其中的同步代码 按照执行顺序加入执行栈中,然后从头开始执行。如果当前执行的是一个方法,那么js会向执行栈中添加这个方法的执行环境,然后进入这个执行环境继续执行其中的代码。当这个执行环境中的代码 执行完毕并返回结果后,js会退出这个执行环境并把这个执行环境销毁,回到上一个方法的执行环境。这个过程反复进行,直到执行栈中的代码全部执行完毕。
栗子
//(1) console.log(1) //(2) setTimeout(()=>{ console.log(2) },100) //(3) console.log(3)
所以结果是 1 3 2;
注意:setTimeout/Promise等我们称之为任务源。而进入任务队列的是他们指定的回调;
上面的循环只是一个宏观的表述,实际上异步任务之间也是有不同的,分为 宏任务(macro task) 与 微任务(micro task),最新的标准中,他们被称为 task与 jobs
下面我们再详细讲解一下执行过程:
执行栈在执行的时候,会把宏任务放在一个宏任务的任务队列,把微任务放在一个微任务的任务队列,在当前执行栈为空的时候,主线程会 查看微任务队列是否有事件存在。如果微任务队列不存在,那么会去宏任务队列中 取出一个任务 加入当前执行栈;如果微任务队列存在,则会依次执行微任务队列中的所有任务,直到微任务队列为空(同样,是吧队列中的事件加到执行栈执行),然后去宏任务队列中取出最前面的一个事件加入当前执行栈...如此反复,进入循环。
注意:
栗子
//(1) setTimeout(()=>{ console.log(1) // 宏任务 },100) //(2) setTimeout(()=>{ console.log(2) // 宏任务 },100) //(3) new Promise(function(resolve,reject){ //(4) console.log(3) // 直接打印 resolve(4) }).then(function(val){ //(5) console.log(val); // 微任务 }) //(6) new Promise(function(resolve,reject){ //(7) console.log(5) // 直接打印 resolve(6) }).then(function(val){ //(8) console.log(val); // 微任务 }) //(9) console.log(7) // 直接打印 //(10) setTimeout(()=>{ console.log(8) // 宏任务,单比(1)(2)宏任务早 },50)
上面的代码在node和chrome环境的正确打印顺序是 3 5 7 4 6 8 1 2
下面分析一下执行过程:
Nota: Kerana pemaparan juga merupakan makro tugasan, pemaparan perlu dilaksanakan selepas timbunan pelaksanaan telah dilaksanakan Oleh itu, jika terdapat beberapa kod yang menukar gaya yang sama secara serentak dalam timbunan pelaksanaan pada masa yang sama, hanya Render yang terakhir.
Cadangan berkaitan: Tutorial pembelajaran javascript
Atas ialah kandungan terperinci Teknik klasik: single-threading dan JavaScript tak segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!