Rumah hujung hadapan web tutorial js Penyelidikan tentang API berbilang benang pekerja web dalam kemahiran JavaScript_javascript

Penyelidikan tentang API berbilang benang pekerja web dalam kemahiran JavaScript_javascript

May 16, 2016 pm 04:28 PM
api javascript web worker multithreading

HTML5 menyokong API seperti Web Worker, membenarkan halaman web melaksanakan kod berbilang benang dengan selamat. Walau bagaimanapun, Web Worker sebenarnya tertakluk kepada banyak batasan, kerana ia tidak boleh benar-benar berkongsi data memori dan hanya boleh membuat pemberitahuan status melalui mesej, jadi ia tidak boleh dipanggil "pelbagai benang" dalam erti kata sebenar.

Antara muka Web Worker sangat menyusahkan untuk digunakan Ia pada asasnya disertakan dengan kotak pasir, menjalankan fail js bebas dalam kotak pasir dan berkomunikasi dengan utas utama melalui postMessage dan onMessage:

Salin kod Kod adalah seperti berikut:

var worker = new Worker("my.js");
var bundle = {message:'Hello world', id:1};
worker.postMessage(bundle); //postMessage boleh menghantar objek bersiri
worker.onmessage = function(evt){
Console.log(evt.data); //Bandingkan objek yang dihantar semula daripada pekerja dengan objek dalam utas utama
console.log(bundle); //{message:'Hello world', id:1}
}

Salin kod Kod adalah seperti berikut:

//dalam my.js
onmessage = function(evt){
var data = evt.data;
Data.id ;
PostMessage(data); //{message:'Hello world', id:2}
}

Hasil yang diperolehi boleh didapati bahawa id data yang diperolehi dalam benang telah meningkat, tetapi selepas ia dihantar semula, id dalam berkas utas utama tidak berubah sebenarnya disalin, jadi Jika ya, utas tidak berkongsi data dan mengelakkan konflik baca dan tulis, jadi ia selamat. Harga untuk memastikan keselamatan benang adalah untuk mengehadkan keupayaan untuk memanipulasi objek benang utama dalam benang.

Mekanisme berbilang benang yang terhad ini sangat menyusahkan untuk digunakan. Kami pastinya berharap Worker dapat menyokong menjadikan kod tersebut kelihatan seperti ia mempunyai keupayaan untuk mengendalikan berbilang rangkaian pada masa yang sama berikut:

Salin kod Kod adalah seperti berikut:

var worker = ThreadWorker baharu(bundle /*shared obj*/);

worker.run(function(bundle){
//buat sth dalam thread pekerja...
This.runOnUiThread(function(bundle /*shared obj*/){
                  //lakukan sth dalam utas ui utama...
});
//...
});

Dalam kod ini, selepas kita memulakan pekerja, kita boleh membiarkan sebarang kod dijalankan dalam pekerja, dan apabila kita perlu mengendalikan utas ui (seperti membaca dan menulis DOM), kita boleh kembali ke utas utama untuk pelaksanaan melalui ini.runOnUiThread.

Jadi bagaimana untuk melaksanakan mekanisme ini? Lihat kod di bawah:

Salin kod Kod adalah seperti berikut:

function WorkerThread(sharedObj){
This._worker = new Worker("thread.js");
This._completes = {};
This._task_id = 0;
This.sharedObj = sharedObj;

var self = ini;
This._worker.onmessage = function(evt){
var ret = evt.data;
Jika(kembali__UI_TUGASAN__){
                    //jalankan pada tugas ui
          var fn = (Fungsi baharu("kembali " ret.__UI_TASK__))();
                 fn(ret.sharedObj);
         }lain{
                self.sharedObj = ret.sharedObj;
                diri._selesai[ret.taskId](ret);
}
}
}

WorkerThread.prototype.run = fungsi(tugas, selesai){
var _task = {__THREAD_TASK__:task.toString(), sharedObj: this.sharedObj, taskId: this._task_id};
This._completes[this._task_id ] = complete;
This._worker.postMessage(_task);
}

Kod di atas mentakrifkan objek ThreadWorker, yang mencipta Pekerja Web yang menjalankan thread.js, menyimpan objek kongsi SharedObj dan memproses mesej yang dihantar semula oleh thread.js.

Jika mesej UI_TASK dikembalikan daripada thread.js, kemudian jalankan fungsi yang diluluskan oleh mesej, jika tidak, laksanakan panggilan balik lengkap run Mari kita lihat cara thread.js ditulis:

Salin kod Kod adalah seperti berikut:

onmessage = function(evt){
var data = evt.data;

jika(data && data.__THREAD_TASK__){
        var task = data.__THREAD_TASK__;
         cuba{
               var fn = (Fungsi baharu("kembali " tugas))();

var ctx = {
threadSignal: benar,
tidur: fungsi(selang){
                                       ctx.threadSignal = palsu;
                          setTimeout(_run, interval);
                 },
                  runOnUiThread: fungsi (tugas){
PostMessage({__UI_TASK__:task.toString(), sharedObj:data.sharedObj});
                }
            }

fungsi _run(){
                  ctx.threadSignal = benar;
              var ret = fn.call(ctx, data.sharedObj);
PostMessage({error:null, returnValue:ret, __THREAD_TASK__:task, sharedObj:data.sharedObj, taskId: data.taskId});
            }

_run(0);

}tangkap(cth){
PostMessage({error:ex.toString(), returnValue:null, sharedObj: data.sharedObj});
}
}
}

Seperti yang anda lihat, thread.js menerima mesej daripada utas ui, yang paling penting ialah THREAD_TASK, iaitu "tugas" yang diluluskan oleh utas ui yang perlu dilaksanakan oleh utas pekerja Sejak fungsi itu tidak boleh bersiri, Apa yang diluluskan ialah rentetan Benang pekerja menghuraikan rentetan ke dalam fungsi untuk melaksanakan tugasan yang diserahkan oleh utas utama (perhatikan bahawa objek kongsi sharedObj dihantar semasa tugasan itu selesai). hasil pulangan dihantar ke utas ui melalui mesej. Mari kita lihat dengan lebih dekat Selain nilai pulangan returnValue, objek kongsi sharedObj juga akan dihantar kembali, kerana benang pekerja dan utas ui tidak berkongsi objek, kami menyegerakkan objek pada kedua-dua sisi melalui. tugasan (adakah thread ini selamat? ? Kenapa? )

Anda dapat melihat bahawa keseluruhan proses tidak rumit Selepas pelaksanaan ini, ThreadWorker ini boleh digunakan dalam dua cara berikut:

Salin kod Kod adalah seperti berikut:

var t1 = WorkerThread baharu({i: 100} /*shared obj*/);

        set Interval(function(){
            t1.run(function(sharedObj){
                    kembalikan sharedObj.i ;
                },
                fungsi(r){
                    console.log("t1>" r.returnValue ":" r.error);
                }
            );
        }, 500);
var t2 = Benang Pekerja baharu({i: 50});

        t2.run(function(sharedObj){  
            manakala(this.threadSignal){
                sharedObj.i ;

                this.runOnUiThread(function(sharedObj){
                    W("body ul").appendChild("

  • " sharedObj.i "
  • ");
                    });

                    this.sleep(500);
                }
                kembalikan sharedObj.i;
            }, fungsi(r){
                console.log("t2>" r.returnValue ":" r.error);
            });

    🎜

    好了,关于Pekerja Web的用法探讨就介绍到这里,有兴趣的同学可以去看一下下这个里,有兴趣的同学可以去看一下这个页https://gitkira目顬/Wkira个页.js (由于Worker需要用服务器测试,我特意在项目中放了一个山寨的httpd.js,是个非常简陋的http服务的js,直接用node就可从就可从。

    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

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Arahan sembang dan cara menggunakannya
    1 bulan 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)

    Pengecualian fungsi C++ dan multithreading: pengendalian ralat dalam persekitaran serentak Pengecualian fungsi C++ dan multithreading: pengendalian ralat dalam persekitaran serentak May 04, 2024 pm 04:42 PM

    Pengendalian pengecualian fungsi dalam C++ amat penting untuk persekitaran berbilang benang untuk memastikan keselamatan benang dan integriti data. Pernyataan cuba-tangkap membolehkan anda menangkap dan mengendalikan jenis pengecualian tertentu apabila ia berlaku untuk mengelakkan ranap program atau rasuah data.

    Penggunaan rangka kerja ujian unit JUnit dalam persekitaran berbilang benang Penggunaan rangka kerja ujian unit JUnit dalam persekitaran berbilang benang Apr 18, 2024 pm 03:12 PM

    Terdapat dua pendekatan biasa apabila menggunakan JUnit dalam persekitaran berbilang benang: ujian berbenang tunggal dan ujian berbilang benang. Ujian berutas tunggal dijalankan pada utas utama untuk mengelakkan isu konkurensi, manakala ujian berbilang utas dijalankan pada utas pekerja dan memerlukan pendekatan ujian disegerakkan untuk memastikan sumber yang dikongsi tidak terganggu. Kes penggunaan biasa termasuk menguji kaedah selamat berbilang benang, seperti menggunakan ConcurrentHashMap untuk menyimpan pasangan nilai kunci, dan utas serentak untuk beroperasi pada pasangan nilai kunci dan mengesahkan ketepatannya, mencerminkan aplikasi JUnit dalam persekitaran berbilang benang. .

    Bagaimana untuk melaksanakan multi-threading dalam PHP? Bagaimana untuk melaksanakan multi-threading dalam PHP? May 06, 2024 pm 09:54 PM

    PHP multithreading merujuk kepada menjalankan berbilang tugas secara serentak dalam satu proses, yang dicapai dengan mencipta benang berjalan secara bebas. Anda boleh menggunakan sambungan Pthreads dalam PHP untuk mensimulasikan tingkah laku berbilang benang Selepas pemasangan, anda boleh menggunakan kelas Thread untuk mencipta dan memulakan utas. Contohnya, apabila memproses sejumlah besar data, data boleh dibahagikan kepada berbilang blok dan bilangan benang yang sepadan boleh dibuat untuk memprosesnya secara serentak untuk meningkatkan kecekapan.

    Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Apr 26, 2024 pm 04:15 PM

    Teknik concurrency dan multithreading menggunakan fungsi Java boleh meningkatkan prestasi aplikasi, termasuk langkah berikut: Memahami konsep concurrency dan multithreading. Manfaatkan pustaka konkurensi dan berbilang benang Java seperti ExecutorService dan Callable. Amalkan kes seperti pendaraban matriks berbilang benang untuk memendekkan masa pelaksanaan. Nikmati kelebihan peningkatan kelajuan tindak balas aplikasi dan kecekapan pemprosesan yang dioptimumkan yang dibawa oleh concurrency dan multi-threading.

    Bagaimana untuk menangani sumber yang dikongsi dalam multi-threading dalam C++? Bagaimana untuk menangani sumber yang dikongsi dalam multi-threading dalam C++? Jun 03, 2024 am 10:28 AM

    Mutex digunakan dalam C++ untuk mengendalikan sumber perkongsian berbilang benang: buat mutex melalui std::mutex. Gunakan mtx.lock() untuk mendapatkan mutex dan menyediakan akses eksklusif kepada sumber yang dikongsi. Gunakan mtx.unlock() untuk melepaskan mutex.

    Cabaran dan strategi untuk menguji program berbilang benang dalam C++ Cabaran dan strategi untuk menguji program berbilang benang dalam C++ May 31, 2024 pm 06:34 PM

    Pengujian program berbilang benang menghadapi cabaran seperti ketidakbolehulangan, ralat konkurensi, kebuntuan dan kekurangan keterlihatan. Strategi termasuk: Ujian unit: Tulis ujian unit untuk setiap utas untuk mengesahkan kelakuan utas. Simulasi berbilang benang: Gunakan rangka kerja simulasi untuk menguji program anda dengan kawalan ke atas penjadualan benang. Pengesanan perlumbaan data: Gunakan alat untuk mencari perlumbaan data yang berpotensi, seperti valgrind. Nyahpepijat: Gunakan penyahpepijat (seperti gdb) untuk memeriksa status program masa jalan dan mencari sumber perlumbaan data.

    Cabaran dan tindakan balas pengurusan memori C++ dalam persekitaran berbilang benang? Cabaran dan tindakan balas pengurusan memori C++ dalam persekitaran berbilang benang? Jun 05, 2024 pm 01:08 PM

    Dalam persekitaran berbilang benang, pengurusan memori C++ menghadapi cabaran berikut: perlumbaan data, kebuntuan dan kebocoran memori. Tindakan balas termasuk: 1. Menggunakan mekanisme penyegerakan, seperti mutex dan pembolehubah atom 2. Menggunakan struktur data tanpa kunci 3. Menggunakan penunjuk pintar 4. (Pilihan) Melaksanakan pengumpulan sampah;

    Pengendalian pengecualian dalam teknologi C++: Bagaimana untuk mengendalikan pengecualian dengan betul dalam persekitaran berbilang benang? Pengendalian pengecualian dalam teknologi C++: Bagaimana untuk mengendalikan pengecualian dengan betul dalam persekitaran berbilang benang? May 09, 2024 pm 12:36 PM

    Dalam C++ berbilang benang, pengendalian pengecualian mengikut prinsip berikut: ketepatan masa, keselamatan benang dan kejelasan. Dalam amalan, anda boleh memastikan keselamatan benang bagi kod pengendalian pengecualian dengan menggunakan mutex atau pembolehubah atom. Selain itu, pertimbangkan kemasukan semula, prestasi dan ujian kod pengendalian pengecualian anda untuk memastikan ia berjalan dengan selamat dan cekap dalam persekitaran berbilang benang.

    See all articles