Saya telah melihat tautan ini: Menerapkan Pengecualian Bersama dalam JavaScript . Di sisi lain, saya telah membaca bahwa tidak ada utas di javascript, tetapi apa sebenarnya artinya itu?
Ketika peristiwa terjadi, di mana dalam kode tersebut dapat mengganggu?
Dan jika tidak ada utas di JS, apakah saya perlu menggunakan mutex di JS atau tidak?
Secara khusus, saya bertanya-tanya tentang efek dari menggunakan fungsi yang disebut oleh setTimeout()
dan XmlHttpRequest
's onreadystatechange
pada variabel dapat diakses secara global.
javascript
multithreading
mutex
Ovesh
sumber
sumber
Jawaban:
Javascript didefinisikan sebagai bahasa reentrant yang berarti tidak ada threading yang diekspos ke pengguna, mungkin ada untaian dalam penerapannya. Fungsi seperti
setTimeout()
dan callback asinkron harus menunggu mesin skrip tidur sebelum dapat dijalankan.Artinya segala sesuatu yang terjadi dalam suatu acara harus diselesaikan sebelum acara berikutnya diproses.
Karena itu, Anda mungkin memerlukan mutex jika kode Anda melakukan sesuatu yang mengharapkan nilai tidak berubah antara saat peristiwa asinkron dipicu dan saat callback dipanggil.
Misalnya jika Anda memiliki struktur data di mana Anda mengklik satu tombol dan mengirimkan XmlHttpRequest yang memanggil callback, mengubah struktur data dengan cara yang merusak, dan Anda memiliki tombol lain yang mengubah struktur data yang sama secara langsung, antara saat peristiwa itu terjadi. diaktifkan dan ketika panggilan kembali dijalankan, pengguna dapat mengklik dan memperbarui struktur data sebelum panggilan balik yang kemudian dapat kehilangan nilainya.
Meskipun Anda dapat membuat kondisi balapan seperti itu, sangat mudah untuk mencegahnya dalam kode Anda karena setiap fungsi akan bersifat atomik. Ini akan menjadi pekerjaan yang berat dan mengambil beberapa pola pengkodean yang aneh untuk menciptakan kondisi balapan sebenarnya.
sumber
Jawaban atas pertanyaan ini agak ketinggalan jaman meskipun benar pada saat diberikan. Dan masih benar jika melihat aplikasi javascript sisi klien yang TIDAK menggunakan webworkers.
Artikel tentang web-worker:
multithreading dalam javascript menggunakan webworkers
Mozilla pada webworkers
Ini jelas menunjukkan bahwa javascript melalui pekerja web memiliki kemampuan multithreading. Mengenai pertanyaan apakah mutex diperlukan dalam javascript? Saya tidak yakin akan hal ini. Tetapi posting stackoverflow ini tampaknya relevan:
Pengecualian Saling untuk N Thread Asinkron
sumber
Seperti yang @william tunjukkan,
Ini dapat digeneralisasikan lebih lanjut - jika kode Anda melakukan sesuatu yang mengharapkan kontrol eksklusif atas sumber daya hingga permintaan asinkron terselesaikan, Anda mungkin memerlukan mutex.
Contoh sederhananya adalah di mana Anda memiliki tombol yang mengaktifkan panggilan ajax untuk membuat rekaman di back end. Anda mungkin memerlukan sedikit kode untuk melindungi Anda dari pemicu pengguna yang senang mengklik pergi dan dengan demikian membuat banyak catatan. Ada sejumlah pendekatan untuk masalah ini (misalnya menonaktifkan tombol, mengaktifkan sukses di ajax). Anda juga bisa menggunakan kunci sederhana:
Saya tidak yakin apakah itu pendekatan terbaik dan saya akan tertarik untuk melihat bagaimana orang lain menangani pengecualian timbal balik dalam javascript, tetapi sejauh yang saya tahu itu mutex sederhana dan berguna.
sumber
while
dengansetTimeout
atausetInterval
denganclearInterval
setelah n kegagalan sehingga Anda memiliki logika coba lagi & batas waktu. Membiarkan apa adanya berarti Anda baru saja melewati kode yang terkunci. Penanganan eksternal dengan mutex dan objek bersama sama pentingnya dengan implementasinya sendiri.JavaScript adalah utas tunggal ... meskipun Chrome mungkin adalah binatang baru (saya pikir itu juga utas tunggal, tetapi setiap tab memiliki utas JavaScript sendiri ... Saya belum memeriksanya secara detail, jadi jangan mengutip saya sana).
Namun, satu hal yang perlu Anda khawatirkan adalah bagaimana JavaScript Anda akan menangani beberapa permintaan ajax yang datang kembali dalam urutan yang tidak sama saat Anda mengirimnya. Jadi, yang benar-benar perlu Anda khawatirkan adalah memastikan panggilan ajax Anda ditangani sedemikian rupa sehingga tidak akan menginjak kaki satu sama lain jika hasilnya muncul dalam urutan yang berbeda dari yang Anda kirimkan.
Ini juga berlaku untuk batas waktu ...
Ketika JavaScript mengembangkan multithreading, maka mungkin khawatir tentang mutex dan sejenisnya ....
sumber
Ya, mutexes dapat diperlukan dalam Javascript ketika mengakses sumber daya yang dibagi antara tab / jendela, seperti localStorage .
Misalnya, jika pengguna membuka dua tab, kode sederhana seperti berikut ini tidak aman:
Antara waktu item localStorage adalah 'got' dan 'set', tab lain mungkin telah mengubah nilainya. Ini umumnya tidak mungkin, tetapi mungkin - Anda harus menilai sendiri kemungkinan dan risiko yang terkait dengan perselisihan apa pun dalam keadaan khusus Anda.
Lihat artikel berikut untuk detail lebih lanjut:
sumber
JavaScript, bahasanya , bisa multithread sesuai keinginan Anda, tetapi embeddings browser mesin javascript hanya menjalankan satu callback (onload, onfocus, <script>, dll ...) pada satu waktu (per tab, mungkin). Saran William menggunakan Mutex untuk perubahan antara mendaftar dan menerima panggilan balik tidak boleh dianggap terlalu harfiah karena ini, karena Anda tidak ingin memblokir dalam panggilan balik intervensi karena panggilan balik yang akan membukanya akan diblokir di belakang panggilan balik saat ini ! (Wow, bahasa Inggris payah untuk berbicara tentang threading.) Dalam kasus ini, Anda mungkin ingin melakukan sesuatu di sepanjang baris pengiriman ulang acara saat ini jika sebuah bendera disetel, baik secara harfiah atau dengan semacam setTimeout ().
Jika Anda menggunakan penyematan JS yang berbeda, dan itu mengeksekusi beberapa utas sekaligus, itu bisa menjadi sedikit lebih tidak pasti, tetapi karena cara JS dapat menggunakan callback dengan begitu mudah dan mengunci objek pada akses properti, penguncian eksplisit hampir tidak diperlukan . Namun, saya akan terkejut jika embedding yang dirancang untuk kode umum (misalnya, game scripting) yang menggunakan multi threading juga tidak memberikan beberapa primitif penguncian eksplisit.
Maaf untuk dinding teks!
sumber
Peristiwa diberi isyarat, tetapi eksekusi JavaScript masih bersifat single-threaded.
Pemahaman saya adalah bahwa ketika event ditandai mesin berhenti apa yang sedang dijalankan pada saat menjalankan event handler. Setelah penangan selesai, eksekusi skrip dilanjutkan. Jika event handler mengubah beberapa variabel bersama, kode yang dilanjutkan akan melihat perubahan ini muncul "tiba-tiba".
Jika Anda ingin "melindungi" data bersama, flag boolean sederhana sudah cukup.
sumber