Rumah >hujung hadapan web >tutorial js >Multi-threading dalam JavaScript

Multi-threading dalam JavaScript

Christopher Nolan
Christopher Nolanasal
2025-02-25 11:37:12887semak imbas

Multi-threading dalam JavaScript

Baiklah, sebelum kita mula, biarkan saya datang bersih dan mengakui bahawa tajuk artikel ini adalah sedikit sensasi! JavaScript tidak mempunyai keupayaan pelbagai threading, dan tidak ada pengaturcara JavaScript yang boleh dilakukan untuk mengubahnya. Dalam semua pelayar - selain dari Google Chrome - JavaScript berjalan dalam satu benang pelaksanaan tunggal, dan itulah caranya.

Walau bagaimanapun, apa yang boleh kita lakukan ialah

mensimulasikan

multi-threading, sejauh ia menimbulkan salah satu manfaat persekitaran pelbagai threaded: ia membolehkan kita menjalankan kod yang sangat intensif. Ini adalah kod yang sebaliknya akan membekukan penyemak imbas dan menghasilkan salah satu daripada "skrip tidak responsif" amaran di Firefox. Kunci Takeaways

JavaScript tidak menyokong multi-threading secara asli tetapi menyerupai ia melalui pemasa asynchronous dan pekerja web, yang membolehkan pengiraan intensif tanpa membekukan penyemak imbas.
  • pemasa asynchronous memecahkan tugas ke dalam ketulan yang lebih kecil, menghalang penyemak imbas menjadi tidak bertindak balas dengan menguruskan bagaimana kod dilaksanakan dari masa ke masa.
  • Pekerja web meningkatkan keupayaan JavaScript untuk melaksanakan tugas latar belakang tanpa menjejaskan antara muka pengguna, walaupun mereka tidak dapat berinteraksi dengan DOM atau menggunakan API web tertentu.
  • Untuk operasi kompleks yang risiko mengunci penyemak imbas, kod refactoring untuk menggunakan pemasa asynchronous dapat menghalang pembekuan UI dan menguruskan proses intensif sumber dengan lebih berkesan.
  • Walaupun sifat tunggal JavaScript, teknik-teknik seperti pengaturcaraan asynchronous dan pekerja web menyediakan pemaju dengan alat yang mantap untuk mengendalikan senario seperti pelbagai threading, meningkatkan prestasi untuk tugas-tugas intensif.
  • masa menunggu tiada
  • Ia semua bergantung pada penggunaan pemasa tak segerak. Apabila kita menjalankan kod berulang di dalam pemasa yang tidak segerak, kita memberikan masa penterjemah skrip penyemak imbas untuk memproses setiap lelaran.

dengan berkesan, sekeping kod di dalamnya untuk Iterator meminta penterjemah melakukan segala -galanya dengan segera: "Jalankan kod ini

n

kali secepat mungkin." Walau bagaimanapun kod yang sama di dalam pemasa tak segerak adalah memecahkan kod ke dalam ketulan kecil yang bijak; iaitu, "Jalankan kod ini sekali sebaik mungkin," - kemudian tunggu - kemudian "jalankan kod ini secepat mungkin", dan sebagainya,

n

kali. Caranya ialah kod di dalam setiap lelaran adalah kecil dan cukup mudah untuk penterjemah untuk memprosesnya sepenuhnya dalam kelajuan pemasa, sama ada 100 atau 5,000 milisaat. Sekiranya keperluan itu dipenuhi, maka tidak kira betapa kuatnya kod keseluruhannya, kerana kami tidak meminta ia dijalankan sekaligus.

betapa sengitnya "terlalu sengit"?

Biasanya, jika saya menulis skrip yang terbukti terlalu intensif, saya akan melihat semula kejuruteraannya; Kelembapan yang signifikan biasanya menunjukkan masalah dengan kod, atau masalah yang lebih mendalam dengan reka bentuk aplikasi.

Tetapi kadang -kadang tidak. Kadang -kadang tidak ada cara untuk mengelakkan intensiti operasi tertentu, kekurangan tidak melakukannya dalam JavaScript sama sekali.

yang mungkin penyelesaian terbaik dalam kes tertentu; Mungkin beberapa pemprosesan dalam aplikasi perlu dipindahkan ke sisi pelayan, di mana ia mempunyai lebih banyak kuasa pemprosesan untuk bekerja dengan, secara amnya, dan persekitaran pelaksanaan yang benar-benar berulir (pelayan web).

Tetapi akhirnya anda mungkin mendapati situasi di mana itu bukan pilihan - di mana JavaScript hanya mesti dapat melakukan sesuatu, atau dihukum. Itulah keadaan yang saya dapati ketika membangunkan lanjutan Firefox saya, pemilih debu-saya.

Inti pelanjutan itu adalah keupayaan untuk menguji pemilih CSS yang digunakan pada halaman, untuk melihat sama ada mereka sebenarnya digunakan. Intipati ini adalah satu set penilaian menggunakan kaedah Matchall () dari Dean Edwards 'Base2:

for(var i=0; i<selectors.length; i++) <br>
{ <br>
  if(base2.DOM.Document.matchAll <br>
    (contentdoc, selectors[i]).length > 0) <br>
  { <br>
    used ++; <br>
  } <br>
  else <br>
  { <br>
    unused ++; <br>
  } <br>
}

cukup mudah, pasti. Tetapi Matchall () sendiri cukup sengit, mempunyai - seperti yang dilakukan - untuk menghuraikan dan menilai mana -mana pemilih CSS1 atau CSS2, kemudian berjalan seluruh Pokok Dom mencari perlawanan; dan lanjutannya untuk setiap pemilih individu , yang mana mungkin terdapat beberapa ribu. Proses itu, di permukaan begitu mudah, boleh menjadi begitu intensif sehingga seluruh penyemak imbas membeku semasa ia berlaku. Dan inilah yang kita dapati.

Mengunci penyemak imbas jelas bukan pilihan, jadi jika ini berfungsi sama sekali, kita mesti mencari cara untuk membuatnya berjalan tanpa kesilapan.

kes ujian mudah

mari kita tunjukkan masalah dengan kes ujian mudah yang melibatkan dua tahap lelaran; Tahap dalaman sengaja terlalu intensif supaya kita dapat mewujudkan keadaan perlumbaan, sementara tahap luar agak pendek sehingga ia mensimulasikan kod utama. Inilah yang kita ada:

function process() <br>
{ <br>
  var above = 0, below = 0; <br>
  for(var i=0; i<200000; i++) <br>
  { <br>
    if(Math.random() * 2 > 1) <br>
    { <br>
      above ++;       <br>
    } <br>
    else <br>
    { <br>
      below ++; <br>
    } <br>
  } <br>
} <br>
 <br>
 <br>
function test1() <br>
{ <br>
  var result1 = document.getElementById('result1'); <br>
   <br>
  var start = new Date().getTime(); <br>
     <br>
  for(var i=0; i<200; i++) <br>
  { <br>
    result1.value =  'time=' +  <br>
      (new Date().getTime() - start) + ' [i=' + i + ']'; <br>
     <br>
    process(); <br>
  } <br>
   <br>
  result1.value = 'time=' +  <br>
    (new Date().getTime() - start) + ' [done]'; <br>
}

Kami memulakan ujian kami, dan mendapatkan output kami, dari bentuk mudah (ini adalah kod ujian, bukan pengeluaran, jadi maafkan saya untuk menggunakan pengendali acara inline):

<form action=""> <br>
  <fieldset> <br>
    <input type="button" value="test1" onclick="test1()" /> <br>
    <input type="text"  /> <br>
  </fieldset> <br>
</form> <br>

Sekarang mari kita jalankan kod itu di Firefox (dalam kes ini, Firefox 3 pada MacBook 2GHz) ... dan seperti yang dijangkakan, penyemak imbas UI membeku semasa ia berjalan (menjadikannya mustahil, sebagai contoh, untuk menekan semula dan meninggalkan prosesnya) . Selepas kira -kira 90 lelaran, Firefox menghasilkan dialog amaran "skrip tidak responsif".

Multi-threading dalam JavaScript
Jika kita membenarkannya diteruskan, selepas 90 lelaran lain Firefox menghasilkan dialog yang sama sekali lagi.

Safari 3 dan Internet Explorer 6 berkelakuan sama dalam hal ini, dengan UI beku dan ambang di mana dialog amaran dihasilkan. Di Opera tidak ada dialog sedemikian - ia terus menjalankan kod sehingga ia selesai - tetapi UI penyemak imbas juga dibekukan sehingga tugas selesai.

Jelas sekali kita tidak dapat menjalankan kod seperti itu dalam amalan. Oleh itu mari kita buat semula dan gunakan pemasa tak segerak untuk gelung luar:

for(var i=0; i<selectors.length; i++) <br>
{ <br>
  if(base2.DOM.Document.matchAll <br>
    (contentdoc, selectors[i]).length > 0) <br>
  { <br>
    used ++; <br>
  } <br>
  else <br>
  { <br>
    unused ++; <br>
  } <br>
}

Sekarang mari kita jalankan lagi ... dan kali ini kita menerima hasil yang sama sekali berbeza. Kod ini mengambil sedikit masa untuk disiapkan, pasti, tetapi ia berjalan dengan jayanya sepanjang jalan hingga akhir, tanpa pembekuan UI dan tanpa amaran tentang skrip yang terlalu perlahan.

Lihat halaman ujian

(bendera sibuk digunakan untuk mengelakkan kejadian pemasa dari berlanggar. Jika kita sudah berada di tengah-tengah sub-proses apabila lelaran seterusnya datang, kita hanya menunggu lelaran berikut, dengan itu memastikan bahawa hanya satu Sub-proses sedang berjalan pada satu masa.)

jadi anda lihat, walaupun kerja yang boleh kita lakukan pada proses

dalaman masih minimum, bilangan bilangan masa kita dapat menjalankan proses itu sekarang tidak terhad: kita dapat menjalankan Gelung luar pada dasarnya selama -lamanya, dan penyemak imbas tidak akan membeku.

Itu lebih menyukainya - kita boleh menggunakannya di alam liar.

anda gila!

Saya dapat mendengar penentang sudah. Sebenarnya, saya boleh menjadi diri saya sendiri: Mengapa anda melakukan ini - apa jenis orang gila yang menegaskan untuk menolak JavaScript ke semua tempat ini yang tidak pernah dirancang untuk pergi? Kod anda terlalu sengit. Ini adalah alat yang salah untuk pekerjaan itu. Sekiranya anda perlu melompat melalui jenis gelung ini maka reka bentuk permohonan anda pada asasnya salah.

Saya telah menyebut satu contoh di mana saya terpaksa mencari jalan untuk skrip berat untuk bekerja; Sama ada itu, atau keseluruhan idea harus ditinggalkan. Jika anda tidak yakin dengan jawapan itu, maka seluruh artikel itu tidak boleh merayu kepada anda sama ada.

Tetapi jika anda - atau sekurang -kurangnya, jika anda terbuka untuk yakin, inilah contoh lain yang benar -benar kuku di rumah: Menggunakan JavaScript untuk menulis permainan di mana anda boleh bermain menentang komputer.

permainan pada

Apa yang saya bicarakan di sini adalah kod yang diperlukan untuk memahami peraturan permainan, yang kemudiannya dapat menilai situasi dan taktik untuk cuba mengalahkan anda pada permainan itu. Barangan rumit.

Untuk menggambarkan, saya akan melihat projek yang saya telah berkembang di sisi untuk seketika. Dengan "sedikit" saya maksudkan

tiga tahun

, majoriti yang dibelanjakan di dataran tinggi di mana permainan secara teorinya bekerja, tetapi terlalu sengit untuk digunakan ... sehingga saya memikirkan pendekatan ini. Permainan ini adalah teka-teki yang kompetitif berdasarkan warna dan pencocokan bentuk.

Multi-threading dalam JavaScript
Untuk meringkaskan: Anda membuat jalan anda di papan dengan bentuk bersebelahan dan padanan warna. Sebagai contoh, jika anda bermula, katakan, segitiga hijau - maka anda boleh berpindah ke segitiga lain, atau bentuk hijau yang lain. Objektif anda adalah untuk mencapai kristal di tengah, kemudian bawa ke sisi lain papan, sementara lawan anda cuba melakukan perkara yang sama. Anda juga boleh mencuri kristal dari lawan anda.

Jadi, kita mempunyai peraturan logik yang menentukan pergerakan dan kita juga dapat melihat taktik yang muncul. Sebagai contoh, untuk mengelakkan lawan anda mencapai kristal, atau mencuri dari anda - anda mungkin memilih langkah yang menghalang mereka, atau cuba menyelesaikan di tempat yang mereka tidak dapat mencapai.

Kerja komputer adalah untuk mencari langkah terbaik untuk sebarang situasi yang diberikan, jadi mari kita lihat proses itu dalam ringkasan pseudo-code:

for(var i=0; i<selectors.length; i++) <br>
{ <br>
  if(base2.DOM.Document.matchAll <br>
    (contentdoc, selectors[i]).length > 0) <br>
  { <br>
    used ++; <br>
  } <br>
  else <br>
  { <br>
    unused ++; <br>
  } <br>
}
kita menilai taktik, dan jika itu memberi kita langkah yang baik maka kita sudah selesai; Jika tidak, kita menilai taktik lain, dan sebagainya, sehingga kita sama ada bergerak, atau menyimpulkan bahawa tidak ada satu dan kita perlu lulus.

Setiap fungsi taktik ini menjalankan proses yang mahal, kerana ia harus menilai setiap kedudukan di papan, serta kedudukan masa depan yang berpotensi, mungkin banyak kali setiap satu berdasarkan pelbagai faktor. Contohnya hanya mempunyai tiga taktik, tetapi dalam permainan sebenar terdapat berpuluh -puluh kemungkinan yang berbeza, masing -masing mahal untuk menilai.

Mana -mana satu daripada penilaian itu secara individu adalah baik, tetapi semuanya bersama -sama, berjalan berturut -turut, membuat proses yang terlalu sengit yang membekukan penyemak imbas.

Jadi apa yang saya lakukan telah membahagikan kod utama ke dalam tugas -tugas yang bijak

, masing -masing dipilih dengan pernyataan suis, dan berulang dengan menggunakan pemasa tak segerak. Logik ini bukan satu juta batu dari mereka yang memilih buku pengembaraan anda sendiri yang pernah saya miliki sebagai seorang kanak -kanak, di mana setiap tugas menyimpulkan dengan pilihan tugas selanjutnya, semuanya dalam masa nyata, sehingga kita sampai pada akhir:

Kod ini jauh lebih jelas daripada yang asal, jadi jika mengurangkan saiz kod adalah satu -satunya yang penting, ini jelas tidak menjadi cara untuk pergi.
function process() <br>
{ <br>
  var above = 0, below = 0; <br>
  for(var i=0; i<200000; i++) <br>
  { <br>
    if(Math.random() * 2 > 1) <br>
    { <br>
      above ++;       <br>
    } <br>
    else <br>
    { <br>
      below ++; <br>
    } <br>
  } <br>
} <br>
 <br>
 <br>
function test1() <br>
{ <br>
  var result1 = document.getElementById('result1'); <br>
   <br>
  var start = new Date().getTime(); <br>
     <br>
  for(var i=0; i<200; i++) <br>
  { <br>
    result1.value =  'time=' +  <br>
      (new Date().getTime() - start) + ' [i=' + i + ']'; <br>
     <br>
    process(); <br>
  } <br>
   <br>
  result1.value = 'time=' +  <br>
    (new Date().getTime() - start) + ' [done]'; <br>
}

Tetapi apa yang kita cuba lakukan di sini adalah mewujudkan persekitaran pelaksanaan tanpa siling, iaitu proses yang tidak mempunyai had atas dari segi kerumitan dan panjang; Dan itulah yang telah kami lakukan.

Corak ini boleh dilanjutkan

selama -lamanya

, dengan beratus -ratus atau bahkan beribu -ribu tugas. Ia mungkin mengambil masa yang lama untuk berlari, tetapi jalankan ia akan, dan selagi setiap individu tugas tidak terlalu sengit, ia akan berjalan tanpa membunuh penyemak imbas. jalan tidak kembali

Kekuatan pendekatan ini juga kelemahan utamanya: kerana fungsi dalaman tidak segerak, kita tidak dapat mengembalikan nilai dari fungsi luar. Jadi, sebagai contoh, kita tidak boleh melakukan ini (atau sebaliknya, kita boleh, tetapi tidak akan ada gunanya):
for(var i=0; i<selectors.length; i++) <br>
{ <br>
  if(base2.DOM.Document.matchAll <br>
    (contentdoc, selectors[i]).length > 0) <br>
  { <br>
    used ++; <br>
  } <br>
  else <br>
  { <br>
    unused ++; <br>
  } <br>
}

yang menyentuh fungsi () akan selalu kembali palsu kerana fungsi dalaman tidak segerak. Fungsi luar akan kembali sebelum lelaran pertama fungsi dalaman telah berlaku!

Contoh seterusnya ini juga sia -sia:

function process() <br>
{ <br>
  var above = 0, below = 0; <br>
  for(var i=0; i<200000; i++) <br>
  { <br>
    if(Math.random() * 2 > 1) <br>
    { <br>
      above ++;       <br>
    } <br>
    else <br>
    { <br>
      below ++; <br>
    } <br>
  } <br>
} <br>
 <br>
 <br>
function test1() <br>
{ <br>
  var result1 = document.getElementById('result1'); <br>
   <br>
  var start = new Date().getTime(); <br>
     <br>
  for(var i=0; i<200; i++) <br>
  { <br>
    result1.value =  'time=' +  <br>
      (new Date().getTime() - start) + ' [i=' + i + ']'; <br>
     <br>
    process(); <br>
  } <br>
   <br>
  result1.value = 'time=' +  <br>
    (new Date().getTime() - start) + ' [done]'; <br>
}

Kami keluar dari skop fungsi luar, oleh itu kami tidak dapat kembali daripadanya; Nilai pulangan itu hilang dengan sia -sia ke dalam eter.

apa yang kita boleh di sini adalah mengambil daun daripada teknik pengekodan Ajax, dan menggunakan fungsi panggilan balik (yang dalam contoh ini saya panggil "onComplete"):

<form action=""> <br>
  <fieldset> <br>
    <input type="button" value="test1" onclick="test1()" /> <br>
    <input type="text"  /> <br>
  </fieldset> <br>
</form> <br>

Jadi apabila kita memanggil Checksomething (), kita lulus fungsi tanpa nama sebagai hujahnya, dan fungsi itu dipanggil dengan nilai akhir apabila kerja selesai:

function test2() <br>
{ <br>
  var result2 = document.getElementById('result2'); <br>
   <br>
  var start = new Date().getTime(); <br>
   <br>
  var i = 0, limit = 200, busy = false; <br>
  var processor = setInterval(function() <br>
  { <br>
    if(!busy) <br>
    { <br>
      busy = true; <br>
       <br>
      result2.value =  'time=' +  <br>
        (new Date().getTime() - start) + ' [i=' + i + ']'; <br>
       <br>
      process(); <br>
       <br>
      if(++i == limit) <br>
      { <br>
        clearInterval(processor); <br>
 <br>
        result2.value = 'time=' +  <br>
          (new Date().getTime() - start) + ' [done]'; <br>
      } <br>
       <br>
      busy = false; <br>
    } <br>
     <br>
  }, 100); <br>
   <br>
}

elegan? Tidak. Tetapi berfungsi dengan kuat? Ya. Dan itulah maksudnya. Menggunakan teknik ini, kita boleh menulis skrip yang tidak mungkin.

Adakah Androids Dream of Silicon Sheep?

Dengan teknik ini dalam kit kami, kami kini mempunyai cara untuk menangani projek JavaScript yang sebelum ini keluar dari alam kemungkinan. Permainan yang saya buat corak ini mempunyai logik yang agak mudah, dan oleh itu otak yang agak mudah, tetapi ia masih terlalu banyak untuk lelaran konvensional; Dan terdapat banyak permainan lain di luar sana yang memerlukan lebih banyak pengaruh!

Pelan seterusnya saya adalah menggunakan teknik ini untuk melaksanakan enjin catur JavaScript. Catur mempunyai pelbagai kemungkinan senario dan taktik yang mungkin, yang membawa kepada keputusan yang boleh mengambil masa yang sangat lama untuk dikira, jauh lebih lama daripada yang boleh dilaksanakan tanpa teknik ini. Pengiraan sengit diperlukan untuk mencipta walaupun mesin pemikiran yang paling asas, dan saya mengaku sangat teruja dengan kemungkinan.

Jika kita boleh menarik helah seperti ini, siapa yang mengatakan apa yang mungkin? Pemprosesan bahasa semulajadi, heuristik ... mungkin kita mempunyai blok bangunan untuk membangunkan kecerdasan buatan dalam JavaScript!

Jika anda suka membaca siaran ini, anda akan suka dipelajari; Tempat untuk mempelajari kemahiran dan teknik segar dari Sarjana. Ahli mendapat akses segera ke semua ebook SitePoint dan kursus dalam talian interaktif, seperti pengaturcaraan JavaScript untuk web. Komen mengenai artikel ini ditutup. Ada soalan mengenai JavaScript? Mengapa tidak bertanya di forum kami? Kredit Imej: Randen L Peterson

soalan yang sering ditanya mengenai multithreading dalam javascript

Apakah peranan pekerja web dalam multithreading JavaScript? Mereka adalah cara yang mudah untuk kandungan web untuk menjalankan skrip dalam benang latar belakang. Benang pekerja boleh melakukan tugas tanpa mengganggu antara muka pengguna. Di samping itu, mereka boleh melakukan I/O menggunakan XMLHTTPREQUEST (walaupun atribut Tindak Balas dan Saluran sentiasa NULL). Setelah dibuat, seorang pekerja boleh menghantar mesej ke kod JavaScript yang menciptanya dengan menghantar mesej kepada pengendali acara yang ditentukan oleh kod itu (dan sebaliknya). 🎜>

JavaScript sememangnya satu-threaded, tetapi ia boleh mengendalikan multithreading melalui penggunaan panggilan balik dan janji-janji yang tidak segerak. Ini bermakna bahawa walaupun JavaScript sendiri beroperasi pada satu benang, ia boleh menjadualkan tugas -tugas yang akan dilaksanakan pada masa akan datang, dengan berkesan membolehkannya melaksanakan pelbagai tugas serentak. Ini amat berguna untuk mengendalikan operasi seperti input pengguna atau permintaan API, yang boleh diproses di latar belakang manakala benang utama terus melaksanakan kod lain. 🎜> Walaupun multithreading dalam JavaScript boleh dicapai melalui pekerja web, penting untuk diperhatikan bahawa pekerja ini tidak mempunyai akses ke DOM atau API web lain. Mereka hanya terhad kepada beberapa jenis data yang boleh mereka hantar ke benang utama. Juga, setiap pekerja adalah contoh yang berasingan, jadi mereka tidak berkongsi skop atau mana-mana pembolehubah global. Dalam modul yang dipanggil 'cluster' yang membolehkan anda membuat proses kanak -kanak (pekerja), yang berkongsi port pelayan dengan proses nod utama (Master). Proses kanak-kanak ini boleh berjalan secara serentak dan berfungsi pada tugas yang berbeza, dengan berkesan melaksanakan multithreading. Isu dengan manipulasi data. Multithreading boleh membawa kepada masalah seperti keadaan kaum, di mana output bergantung kepada urutan atau masa peristiwa yang tidak terkawal lain. Ia dianggap lebih mudah untuk mengoptimumkan persekitaran tunggal, kerana tidak perlu menangani kebergantungan antara benang.

Bagaimana saya boleh menggunakan pekerja web untuk multithreading dalam javascript?

Untuk menggunakan pekerja web untuk multithreading dalam JavaScript, anda perlu membuat objek pekerja baru dan menentukan fail JavaScript untuk dilaksanakan dalam benang pekerja. Anda kemudian boleh berkomunikasi dengan benang pekerja menggunakan kaedah postmessage dan menerima mesej daripadanya menggunakan pengendali acara onMessage.

Bolehkah multithreading membuat kod javascript saya lebih cepat? Lebih cepat, tetapi ia bergantung kepada sifat tugas yang dilakukan. Untuk tugas-tugas intensif CPU, multithreading dapat meningkatkan prestasi dengan ketara dengan membenarkan tugas dilakukan secara selari. Walau bagaimanapun, untuk tugas-tugas I/O yang terikat, manfaat multithreading kurang jelas, kerana tugas-tugas ini sering dibatasi oleh faktor-faktor di luar kawalan CPU, seperti kelajuan rangkaian. Pengaturcaraan dalam JavaScript?

Pengaturcaraan multithreading dan asynchronous adalah kedua -dua teknik yang digunakan untuk menguruskan pelbagai tugas pada masa yang sama masa. Walau bagaimanapun, mereka melakukannya dengan cara yang berbeza. Multithreading melibatkan pelbagai benang pelaksanaan, dengan setiap benang melakukan tugas yang berbeza. Pengaturcaraan Asynchronous, sebaliknya, melibatkan satu benang pelaksanaan, tetapi tugas dapat dimulakan dan kemudian ditahan untuk diselesaikan kemudian, membolehkan tugas -tugas lain dilakukan dalam masa yang sama. Perkongsian data antara benang dalam JavaScript?

Perkongsian data antara benang dalam JavaScript boleh dicapai menggunakan SharedArrayBuffer dan Atomics. SharedArrayBuffer membolehkan berkongsi memori antara benang utama dan benang pekerja, sementara atomik menyediakan kaedah untuk melakukan operasi atom yang selamat pada memori yang dikongsi. , Anda boleh menggunakan multithreading dalam JavaScript untuk pembangunan front-end. Walau bagaimanapun, penting untuk diperhatikan bahawa pekerja web, yang membolehkan multithreading, tidak mempunyai akses ke DOM atau API web lain. Oleh itu, mereka biasanya digunakan untuk tugas -tugas yang tidak melibatkan memanipulasi DOM atau berinteraksi dengan laman web, seperti melakukan pengiraan atau pengendalian data.

Atas ialah kandungan terperinci Multi-threading dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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