Rumah hujung hadapan web tutorial js Gunakan Multi-Thread dalam Javascript - Bukan Mengenai WebWorkers atau WebAssembly

Gunakan Multi-Thread dalam Javascript - Bukan Mengenai WebWorkers atau WebAssembly

Dec 06, 2024 am 04:11 AM

Utilize Multi-Thread in Javascript - Not About WebWorkers nor WebAssembly

Sudah diketahui umum bahawa JavaScript berjalan pada satu urutan. Konsep ini sangat penting sehingga kita sering merujuknya dengan nama - Benang Utama. Jadi, adakah ini bermakna CPU berbilang teras anda tidak berguna apabila menjalankan JavaScript?

Tidak begitu.

JavaScript boleh menjadi agak nakal, menghantar mesej bercampur-campur tentang urutannya.

Tetapi walaupun tanpa menyelidiki ciri yang lebih kompleks seperti Pekerja Web dan WebAssembly, JavaScript asas boleh menggunakan aliran kerja berbilang benang.

Untuk menjadi jelas, artikel ini memfokuskan pada JavaScript berasaskan pelayar web. Persekitaran lain, seperti Node.js, mungkin mengendalikan perkara secara berbeza.

Kami akan meneroka pilihan untuk operasi berbilang benang dan seperti berbilang benang dalam JavaScript. Realitinya - anda boleh dan harus menggunakan aliran kerja berbilang benang dalam JavaScript vanila tulen yang asas.

"Jelaskan!"

Senang.

JavaScript ialah bahasa satu benang, tetapi ia ditafsirkan oleh penyemak imbas web - dan penyemak imbas ialah perisian berbilang benang.

Terdapat beberapa kaedah untuk mensimulasikan dan menggunakan berbilang benang, dan anda mungkin menggunakannya tanpa menyedarinya.

Selain itu, JavaScript sering berkelakuan dalam cara yang kelihatan berbilang benang tanpa benar-benar begitu. Ia mungkin terdengar seperti menipu, tetapi ia memberikan faedah yang kami jangkakan dengan berkesan daripada tingkah laku berbilang benang.

Pengaturcaraan Berasaskan Acara Terasa Berbilang Benang

JavaScript ialah sistem berasaskan acara. Apabila penyemak imbas memproses fail JavaScript, ia menjalankan semua kod di dalamnya. Anda boleh menulis kod yang tidak berhenti berjalan - walaupun itu secara amnya idea yang tidak baik kerana ia boleh merosakkan penyemak imbas.

Apa yang biasa kami lakukan ialah menyediakan pendengar acara dan menunggu sesuatu berlaku. Pada ketika ini, JavaScript melahu sepenuhnya. Penantian terbiar ini tidak akan dapat dilakukan tanpa memunggah beberapa kerja daripada Benang Utama.

Acara itu sendiri tidak berbilang benang, tetapi menunggu dan menyemak acara dikendalikan oleh penyemak imbas, bukan oleh JavaScript. Proses ini diturunkan dari Benang Utama.

Fungsi Asynchronous dan Multi-Threading

Fungsi seperti setTimeout dan setInterval telah bersama kami selama bertahun-tahun. Mereka memunggah masa menunggu daripada Benang Utama.

Mari kita permudahkan cara ini berfungsi. Dalam bahasa peringkat rendah, pemasa dan menunggu sering dilaksanakan dengan sentiasa menyemak, "Adakah sudah tiba masanya?" Bayangkan gelung while() yang menyemak masa berlalu dan meneruskan apabila masa yang sesuai. Pendekatan moden mungkin menggunakan gangguan CPU untuk mengelak daripada menyumbat benang CPU.

Walau bagaimanapun, apabila anda menggunakan setTimeout atau setInterval dalam JavaScript, bahasa itu terbiar sepenuhnya semasa menunggu, yang, sekali lagi, bermakna penantian diproses keluar dari Thread Utama.

Ambil dan API Asynchronous Lain

Hari ini, kami mendapat lebih banyak fungsi tak segerak dan API daripada penyemak imbas. API pengambilan ialah contoh yang terkenal. Malah API yang lebih baharu, seperti API Papan Klip, adalah tidak segerak.

Ini bermakna anda meminta penyemak imbas melakukan tindakan, dan ia membebaskan Benang Utama JavaScript (atau membenarkannya memproses bahan lain - lebih lanjut mengenainya kemudian) dan memberitahu anda (dengan memproses kod berikut) apabila ia selesai.

Asynchronous vs. Multi-Threaded

Asynchronous tidak semestinya bermaksud berbilang benang - tidak selalu, tidak secara langsung. Hanya meletakkan perkataan async di hadapan fungsi tidak menyusahkan anda.

Terdapat dua komponen utama tentang cara JavaScript mengendalikan gelagat tak segerak:

1. Barisan Panggilan Balik dan Gelung Acara

Fikirkan baris gilir panggil balik sebagai barisan fungsi yang menunggu untuk dijalankan. Fungsi ini dilaksanakan satu demi satu dalam Benang Utama. Apabila operasi tak segerak selesai - sama ada acara, tamat masa atau pengambilan selesai - panggilan baliknya diletakkan dalam baris gilir ini.

gelung peristiwa bertanggungjawab untuk mengalihkan panggilan balik daripada baris gilir ke tindanan panggilan apabila tindanan panggilan kosong.

2. Fungsi Diproses Pelayar

Pelayar web mengawal operasi tertentu dan mungkin memutarkan urutan baharu untuknya—ini termasuk tindakan seperti ambil atau setTimeout. JavaScript tidak perlu mengurus urutan ini. Apabila operasi tak segerak selesai, penyemak imbas meletakkan panggilan balik yang sepadan ke dalam baris gilir panggil balik dan JavaScript meneruskan pelaksanaan dari sana.

Pertimbangkan kod ini:

console.log('Start');

setTimeout(() => {
  console.log('This is asynchronous');
});

console.log('End');
Salin selepas log masuk

Output:

Start
End
This is asynchronous
Salin selepas log masuk

Inilah yang berlaku:

  • 'Mula' dilog.
  • setTimeout dipanggil tanpa parameter tamat masa, jadi ia lalai kepada 0 milisaat. Panggilan balik dihantar ke penyemak imbas untuk dilaksanakan selepas tindanan panggilan semasa jelas.
  • 'Tamat' dilog.
  • Benang Utama kini percuma dan gelung acara menyemak baris gilir panggil balik.
  • Fungsi panggil balik dari setTimeout dialihkan ke tindanan panggilan.
  • 'Ini tak segerak' dilog.

Perhatikan bahawa setTimeout tiada parameter tamat masa. Ini ialah teknik biasa untuk menangguhkan pelaksanaan kod keutamaan yang lebih rendah - proses pertama sekali, selepas itu selesai, lakukan perkara "keutamaan lebih rendah".

Apa yang dilakukannya ialah meletakkan fungsi di dalam setTimeout ke dalam baris gilir panggil balik serta-merta, dan ia berjalan pada peluang pertama apabila Benang Utama melahu.

Kes Khas requestAnimationFrame

requestAnimationFrame ialah API penyemak imbas yang memberitahu penyemak imbas anda ingin melaksanakan beberapa kod sebelum ia mengira dan mengemas kini paparan (anggap ia sebagai bingkai sesaat dalam permainan video).

Atas sebab tertentu, pembangun web tidak berfikir dalam mengecat semula dan FPS, tetapi itulah cara ia berfungsi.

Ia sememangnya tak segerak (walaupun bukan berbilang benang).

Menggunakan setTimeout tanpa masa yang ditentukan sering digunakan untuk tujuan yang sama sebelum requestAnimationFrame diperkenalkan, walaupun ia jauh daripada berguna (hanya lebih baik daripada tiada).

Fungsi ini menyusun baris gilir kod anda ke dalam tindanan khas. Sejurus sebelum memaparkan bingkai baharu (mengecat semula), penyemak imbas menjalankan kod beratur ini. Ia sesuai untuk membuat perubahan pada DOM, HTML atau CSS (dan hanya itu, sila, saya melarang anda membuat pengiraan di sana!).

Pilihan Berbilang Benang Sejati

Walaupun artikel ini bukan tentang mereka, perlu dinyatakan bahawa anda boleh mencapai operasi berbilang benang yang benar dengan menggunakan Pekerja Web dan Perhimpunan Web. Ini membolehkan anda menjalankan skrip dalam utas latar belakang. Mereka tidak boleh memanipulasi DOM secara langsung, tetapi mereka tidak ternilai untuk memproses tugas berat (pengiraan matriks, sesiapa?). Pendekatan ini sering digunakan dalam permainan berasaskan HTML5 - yang lebih kompleks, bukan sekadar tic-tac-toe.

Kata-kata Terakhir

JavaScript, apabila diasingkan, kekal berbenang tunggal. Tetapi dalam dunia nyata, ia adalah bahasa yang ditafsirkan yang berjalan dalam persekitaran berbilang benang pelayar web. Jika jurubahasa anda menawarkan bantuan kepada anda, ambil dan gunakannya.

Artikel ini merangkumi banyak perkara - pengetahuan asas, penjelasan peringkat rendah dan banyak lagi. Tetapi begitulah selalunya pembangunan - semuanya saling berkaitan. Sebab itu saya suka melihat gambaran yang lebih luas; kadangkala, tumpuan yang terperinci bukanlah penyelesaian kepada masalah.


Adakah async pernah menyebabkan anda menyahpepijat mimpi ngeri?
Saya pasti pernah - beberapa tahun yang lalu, mendapatkan timbunan dengan ralat bukanlah sesuatu yang penting.

Atas ialah kandungan terperinci Gunakan Multi-Thread dalam Javascript - Bukan Mengenai WebWorkers atau WebAssembly. 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

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu 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)

Topik panas

Tutorial Java
1669
14
Tutorial PHP
1273
29
Tutorial C#
1256
24
Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Apr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Dari C/C ke JavaScript: Bagaimana semuanya berfungsi Dari C/C ke JavaScript: Bagaimana semuanya berfungsi Apr 14, 2025 am 12:05 AM

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

JavaScript dan Web: Fungsi teras dan kes penggunaan JavaScript dan Web: Fungsi teras dan kes penggunaan Apr 18, 2025 am 12:19 AM

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

JavaScript in Action: Contoh dan projek dunia nyata JavaScript in Action: Contoh dan projek dunia nyata Apr 19, 2025 am 12:13 AM

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Memahami Enjin JavaScript: Butiran Pelaksanaan Memahami Enjin JavaScript: Butiran Pelaksanaan Apr 17, 2025 am 12:05 AM

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python vs JavaScript: Komuniti, Perpustakaan, dan Sumber Python vs JavaScript: Komuniti, Perpustakaan, dan Sumber Apr 15, 2025 am 12:16 AM

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Python vs JavaScript: Persekitaran dan Alat Pembangunan Python vs JavaScript: Persekitaran dan Alat Pembangunan Apr 26, 2025 am 12:09 AM

Kedua -dua pilihan Python dan JavaScript dalam persekitaran pembangunan adalah penting. 1) Persekitaran pembangunan Python termasuk Pycharm, Jupyternotebook dan Anaconda, yang sesuai untuk sains data dan prototaip cepat. 2) Persekitaran pembangunan JavaScript termasuk node.js, vscode dan webpack, yang sesuai untuk pembangunan front-end dan back-end. Memilih alat yang betul mengikut keperluan projek dapat meningkatkan kecekapan pembangunan dan kadar kejayaan projek.

Peranan C/C dalam JavaScript Jurubah dan Penyusun Peranan C/C dalam JavaScript Jurubah dan Penyusun Apr 20, 2025 am 12:01 AM

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.

See all articles