1. Mengapakah JavaScript direka untuk berbenang tunggal?
Ciri utama bahasa JavaScript ialah ia berbenang tunggal Dalam erti kata lain, ia hanya boleh melakukan satu perkara pada satu masa.
for(var j = 0; j < 5; j++) { console.log(j); } console.log('end');
Kod di atas tidak akan dijalankan tamat sehingga gelung for dilaksanakan
Urut tunggal JavaScript berkaitan dengan tujuannya. Sebagai bahasa skrip pelayar, tujuan utama JavaScript adalah untuk berinteraksi dengan pengguna dan memanipulasi DOM. Ini menentukan bahawa ia hanya boleh berbenang tunggal, jika tidak, ia akan menyebabkan masalah penyegerakan yang sangat kompleks.
Anggapkan bahawa JavaScript mempunyai dua utas pada masa yang sama Satu utas menambah kandungan pada nod DOM tertentu, dan utas lain memadamkan nod tersebut.
Jadi, untuk mengelakkan kerumitan, JavaScript telah menjadi satu utas sejak ia dilahirkan Ini telah menjadi ciri teras bahasa ini dan tidak akan berubah pada masa hadapan.
Untuk memanfaatkan kuasa pengkomputeran CPU berbilang teras, HTML5 mencadangkan piawaian Pekerja Web, yang membenarkan skrip JavaScript mencipta berbilang rangkaian, tetapi urutan anak dikawal sepenuhnya oleh utas utama dan mesti tidak mengendalikan DOM. Oleh itu, piawaian baharu ini tidak mengubah sifat berbenang tunggal JavaScript.
2. Baris gilir Tugas
"Baris Gilir Tugas" ialah baris gilir acara (juga boleh difahami sebagai baris gilir mesej apabila peranti IO menyelesaikan tugasan, ia ditambahkan pada baris "Task Baris Gilir" Peristiwa yang menunjukkan bahawa tugas tak segerak yang berkaitan boleh memasuki "timbunan pelaksanaan". Benang utama membaca "baris gilir tugas", yang bermaksud membaca peristiwa di dalamnya; beratur. Tugasan seterusnya tidak akan dilaksanakan sehingga tugasan sebelumnya selesai. Jika tugasan sebelumnya mengambil masa yang lama, tugasan seterusnya perlu menunggu.
Sekiranya baris gilir disebabkan terlalu banyak pengiraan, boleh difahami bahawa penggunaan CPU adalah tinggi Namun, banyak kali CPU melahu atau terdapat ruang besar yang tidak digunakan kerana peranti IO (). peranti input dan output). ) adalah sangat perlahan (contohnya, operasi Ajax membaca data dari rangkaian), dan anda hanya boleh meneruskan pelaksanaan selepas menunggu keputusan keluar.
Pereka bahasa JavaScript menyedari bahawa utas utama boleh mengabaikan sepenuhnya peranti IO, menggantung tugas menunggu ini dan menjalankan tugas kemudiannya dahulu. Tunggu sehingga peranti IO mengembalikan keputusan sebelum melaksanakan tugas yang belum selesai.
Oleh itu, semua tugasan boleh dibahagikan kepada dua jenis, satu tugas segerak (synchronous) dan satu lagi tugas tak segerak (asynchronous).
Tugas segerak merujuk kepada tugasan yang dibariskan untuk pelaksanaan pada urutan utama. Tugasan seterusnya hanya boleh dilaksanakan selepas tugasan sebelumnya telah dilaksanakan; utas utama . Untuk tugasan yang memasuki "baris gilir tugas", hanya apabila "baris gilir tugas" memberitahu utas utama bahawa tugas tak segerak boleh dilaksanakan, tugasan itu akan memasuki utas utama untuk dilaksanakan.
Secara khusus, mekanisme pengendalian pelaksanaan tak segerak adalah seperti berikut. (Begitu juga dengan pelaksanaan segerak, kerana ia boleh dianggap sebagai pelaksanaan tak segerak tanpa tugas tak segerak.)
Semua tugas segerak dilaksanakan pada urutan utama, membentuk timbunan pelaksanaan
Di luar utas utama , terdapat juga "barisan tugas". Selagi tugas asynchronous mempunyai hasil yang sedang berjalan, acara diletakkan dalam "baris gilir tugas".
Setelah semua tugasan penyegerakan dalam "timbunan pelaksanaan" telah dilaksanakan, sistem akan membaca "baris gilir tugas" untuk melihat peristiwa yang ada di dalamnya. Tugas tak segerak yang sepadan itu menamatkan keadaan menunggu, masukkan timbunan pelaksanaan dan mulakan pelaksanaan.
Utas utama berulang kali melaksanakan langkah ketiga di atas.
for(var j = 0; j < 5; j++) { console.log(j); setTimeout(function() { console.log('timeout'); }, 0); } console.log('end');
//Keputusan 0 1 2 3 4 tamat tamat masa tamat masa tamat masa tamat masa
Atas ialah kandungan terperinci Apakah benang tunggal JavaScript dan baris gilir tugas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!