cari
Rumahhujung hadapan webtutorial jsPenyelidikan tentang API berbilang benang pekerja web dalam kemahiran JavaScript_javascript

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
    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
    Rangka Kerja JavaScript: Menguasai Pembangunan Web ModenRangka Kerja JavaScript: Menguasai Pembangunan Web ModenMay 02, 2025 am 12:04 AM

    Kuasa rangka kerja JavaScript terletak pada pembangunan yang memudahkan, meningkatkan pengalaman pengguna dan prestasi aplikasi. Apabila memilih rangka kerja, pertimbangkan: 1.

    Hubungan antara JavaScript, C, dan penyemak imbasHubungan antara JavaScript, C, dan penyemak imbasMay 01, 2025 am 12:06 AM

    Pengenalan Saya tahu anda mungkin merasa pelik, apa sebenarnya yang perlu dilakukan oleh JavaScript, C dan penyemak imbas? Mereka seolah -olah tidak berkaitan, tetapi sebenarnya, mereka memainkan peranan yang sangat penting dalam pembangunan web moden. Hari ini kita akan membincangkan hubungan rapat antara ketiga -tiga ini. Melalui artikel ini, anda akan mempelajari bagaimana JavaScript berjalan dalam penyemak imbas, peranan C dalam enjin pelayar, dan bagaimana mereka bekerjasama untuk memacu rendering dan interaksi laman web. Kita semua tahu hubungan antara JavaScript dan penyemak imbas. JavaScript adalah bahasa utama pembangunan front-end. Ia berjalan secara langsung di penyemak imbas, menjadikan laman web jelas dan menarik. Adakah anda pernah tertanya -tanya mengapa Javascr

    Aliran node.js dengan typescriptAliran node.js dengan typescriptApr 30, 2025 am 08:22 AM

    Node.js cemerlang pada I/O yang cekap, sebahagian besarnya terima kasih kepada aliran. Aliran memproses data secara berperingkat, mengelakkan beban memori-ideal untuk fail besar, tugas rangkaian, dan aplikasi masa nyata. Menggabungkan sungai dengan keselamatan jenis typescript mencipta powe

    Python vs JavaScript: Pertimbangan Prestasi dan KecekapanPython vs JavaScript: Pertimbangan Prestasi dan KecekapanApr 30, 2025 am 12:08 AM

    Perbezaan prestasi dan kecekapan antara Python dan JavaScript terutamanya dicerminkan dalam: 1) sebagai bahasa yang ditafsirkan, Python berjalan perlahan tetapi mempunyai kecekapan pembangunan yang tinggi dan sesuai untuk pembangunan prototaip pesat; 2) JavaScript adalah terhad kepada benang tunggal dalam penyemak imbas, tetapi I/O multi-threading dan asynchronous boleh digunakan untuk meningkatkan prestasi dalam node.js, dan kedua-duanya mempunyai kelebihan dalam projek sebenar.

    Asal JavaScript: Meneroka Bahasa PelaksanaannyaAsal JavaScript: Meneroka Bahasa PelaksanaannyaApr 29, 2025 am 12:51 AM

    JavaScript berasal pada tahun 1995 dan dicipta oleh Brandon Ike, dan menyedari bahasa itu menjadi C. 1.C Language menyediakan keupayaan pengaturcaraan prestasi tinggi dan sistem untuk JavaScript. 2. Pengurusan memori JavaScript dan pengoptimuman prestasi bergantung pada bahasa C. 3. Ciri lintas platform bahasa C membantu JavaScript berjalan dengan cekap pada sistem operasi yang berbeza.

    Di sebalik tabir: Apa bahasa JavaScript?Di sebalik tabir: Apa bahasa JavaScript?Apr 28, 2025 am 12:01 AM

    JavaScript berjalan dalam penyemak imbas dan persekitaran Node.js dan bergantung pada enjin JavaScript untuk menghuraikan dan melaksanakan kod. 1) menjana pokok sintaks abstrak (AST) di peringkat parsing; 2) menukar AST ke bytecode atau kod mesin dalam peringkat penyusunan; 3) Laksanakan kod yang disusun dalam peringkat pelaksanaan.

    Masa Depan Python dan JavaScript: Trend dan RamalanMasa Depan Python dan JavaScript: Trend dan RamalanApr 27, 2025 am 12:21 AM

    Trend masa depan Python dan JavaScript termasuk: 1. Kedua -duanya akan terus mengembangkan senario aplikasi dalam bidang masing -masing dan membuat lebih banyak penemuan dalam prestasi.

    Python vs JavaScript: Persekitaran dan Alat PembangunanPython vs JavaScript: Persekitaran dan Alat PembangunanApr 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.

    See all articles

    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!

    Alat panas

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    mPDF

    mPDF

    mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    SublimeText3 Linux versi baharu

    SublimeText3 Linux versi baharu

    SublimeText3 Linux versi terkini

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    Persekitaran pembangunan bersepadu PHP yang berkuasa