国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
什么是ParallelJS,它是如何工作的?
如何安裝ParallelJS?
使用ParallelJS的好處是什么?
我可以在瀏覽器中使用ParallelJS嗎?
如何在ParallelJS中使用.map()方法?
ParallelJS中的.reduce()方法是什么?
我可以在ParallelJS中鏈接方法嗎?
如何在ParallelJS中處理錯誤?
我可以將ParallelJS與其他JavaScript庫一起使用嗎?
ParallelJS適用于所有數據處理任務嗎?
首頁 web前端 js教程 并聯(lián)JavaScript

并聯(lián)JavaScript

Feb 18, 2025 am 08:51 AM

ParallelJS:優(yōu)雅的Web Worker解決方案

ParallelJS為使用Web Worker時可能出現(xiàn)的問題提供了一種優(yōu)雅的解決方案,它提供了一個具有便捷抽象和輔助工具的實用API。HTML5引入的Worker接口允許創(chuàng)建具有較長運行時間和高計算量需求的函數,這些函數可以同時使用以提高網站響應速度。ParallelJS允許對JavaScript代碼進行并行化處理,利用同時多線程 (SMT) 更有效地使用現(xiàn)代CPU。ParallelJS庫提供諸如spawn、mapreduce等方法,分別用于并行執(zhí)行計算、處理數據和聚合碎片化結果。

HTML5帶來的一個最酷的新可能性是Web Workers API的Worker接口。在此之前,我們不得不采用一些技巧來向用戶展示響應迅速的網站。Worker接口允許我們創(chuàng)建具有較長運行時間和高計算量需求的函數。此外,Worker實例可以同時使用,使我們能夠根據需要生成任意數量的這些工作器。在本文中,我將討論為什么多線程很重要,以及如何使用ParallelJS在JavaScript中實現(xiàn)它。

為什么需要多線程?

這是一個合理的問題。從歷史上看,生成線程的能力提供了一種優(yōu)雅的方式來劃分進程中的工作。操作系統(tǒng)負責調度每個線程的可用時間,這樣優(yōu)先級更高、工作量更大的線程將優(yōu)先于低優(yōu)先級的空閑線程。在過去的幾年里,同時多線程 (SMT) 已經成為訪問現(xiàn)代CPU計算能力的關鍵。原因很簡單:摩爾定律在每單位面積晶體管數量方面仍然有效。然而,由于多種原因,頻率縮放不得不停止。因此,必須以其他方式使用可用的晶體管。人們決定,架構改進(例如SIMD)和多核代表最佳選擇。

Parallel JavaScript with ParallelJS

為了使用SMT,我們需要編寫并行代碼,即為獲得單個結果而并行運行的代碼。我們通常需要考慮特殊的算法,因為大多數順序代碼要么很難并行化,要么效率非常低。原因在于Amdahl定律,該定律指出加速比S由下式給出:

Parallel JavaScript with ParallelJS

其中N是并行工作器的數量(例如處理器、核心或線程),P是并行部分。將來可能會使用更多依賴于并行算法的多核架構。在高性能計算領域,GPU系統(tǒng)和特殊架構(例如英特爾至強Phi)代表了此類平臺。最后,我們應該區(qū)分一般的并發(fā)應用程序或算法和并行執(zhí)行。并行性是(可能相關的)計算的同時執(zhí)行。相反,并發(fā)是獨立執(zhí)行進程的組合。

JavaScript中的多線程

在JavaScript中,我們已經知道如何編寫并發(fā)程序,即使用回調函數?,F(xiàn)在可以將此知識轉移到創(chuàng)建并行程序中!根據其自身的結構,JavaScript是在由事件循環(huán)(通常遵循反應器模式)調解的單個線程中執(zhí)行的。例如,這為我們處理對(外部)資源的異步請求提供了一些很好的抽象。它還保證先前定義的回調始終在相同的執(zhí)行線程中觸發(fā)。沒有與線程相關的跨線程異常、競爭條件或其他問題。但是,這并沒有讓我們更接近JavaScript中的SMT。隨著Worker接口的引入,已經找到了一個優(yōu)雅的解決方案。從主應用程序的角度來看,Web Worker中的代碼應被視為并發(fā)運行的任務。通信也是以這種方式進行的。我們使用消息API,該API也可用于從包含的網站到托管頁面的通信。例如,以下代碼通過向發(fā)起者發(fā)送消息來響應傳入的消息。

window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);

理論上,Web Worker也可以生成另一個Web Worker。但是,實際上大多數瀏覽器禁止這樣做。因此,Web Worker之間通信的唯一方法是通過主應用程序。通過消息進行的通信是并發(fā)進行的,因此只有異步(非阻塞)通信。起初,這在編程中可能很奇怪,但它帶來了許多優(yōu)點。最重要的是,我們的代碼應該沒有競爭條件!讓我們來看一個使用兩個參數表示序列的開始和結束來在后臺計算素數序列的簡單示例。首先,我們創(chuàng)建一個名為prime.js的文件,其中包含以下內容:

onmessage = function (event) {
    var arguments = JSON.parse(event.data);
    run(arguments.start, arguments.end);
};
function run (start, end) {
    var n = start;

    while (n < end) {
        var k = Math.sqrt(n);
        var found = false;

        for (var i = 2; !found && i <= k; i++) {
            found = n % i === 0;
        }

        if (!found) {
            postMessage(n.toString());
        }

        n++;
    }
}

現(xiàn)在,我們只需要在主應用程序中使用以下代碼來啟動后臺工作器即可。

if (typeof Worker !== 'undefined') {
    var w = new Worker('prime.js');
    w.onmessage = function(event) {
        console.log(event);
    };
    var args = { start : 100, end : 10000 };
    w.postMessage(JSON.stringify(args));
}

相當多的工作。尤其令人討厭的是使用另一個文件。這產生了很好的分離,但對于較小的任務似乎完全是多余的。幸運的是,有一種解決方法??紤]以下代碼:

var fs = (function () { 
    /* code for the worker */ 
}).toString(); 
var blob = new Blob(
   [fs.substr(13, fs.length - 14)],
   { type: 'text/javascript' }
);
var url = window.URL.createObjectURL(blob);
var worker = new Worker(url);
// Now setup communication and rest as before

當然,我們可能希望有一個比這樣的幻數(13和14)更好的解決方案,并且根據瀏覽器,必須使用Blob和createObjectURL的回退。如果您不是JavaScript專家,fs.substr(13, fs.length - 14)的作用是提取函數體。我們通過將函數聲明轉換為字符串(使用toString()調用)并刪除函數本身的簽名來做到這一點。

ParallelJS能幫上忙嗎?

這就是ParallelJS發(fā)揮作用的地方。它為一些便利以及Web Worker提供了一個不錯的API。它包括許多輔助工具和非常有用的抽象。我們首先提供一些要處理的數據。

var p = new Parallel([1, 2, 3, 4, 5]);
console.log(p.data);

data字段產生提供的數組。還沒有調用任何“并行”操作。但是,實例p包含一組方法,例如spawn,它將創(chuàng)建一個新的Web Worker。它返回一個Promise,這使得使用結果變得輕而易舉。

window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);

上面代碼的問題是計算不會真正并行。我們只創(chuàng)建一個單個后臺工作器,它一次性處理整個數據數組。只有在處理完整個數組后,我們才能獲得結果。更好的解決方案是使用Parallel實例的map函數。

onmessage = function (event) {
    var arguments = JSON.parse(event.data);
    run(arguments.start, arguments.end);
};
function run (start, end) {
    var n = start;

    while (n < end) {
        var k = Math.sqrt(n);
        var found = false;

        for (var i = 2; !found && i <= k; i++) {
            found = n % i === 0;
        }

        if (!found) {
            postMessage(n.toString());
        }

        n++;
    }
}

在前面的示例中,核心非常簡單,可能過于簡單。在一個真實的示例中,將涉及許多操作和函數。我們可以使用require函數包含引入的函數。

if (typeof Worker !== 'undefined') {
    var w = new Worker('prime.js');
    w.onmessage = function(event) {
        console.log(event);
    };
    var args = { start : 100, end : 10000 };
    w.postMessage(JSON.stringify(args));
}

reduce函數有助于將碎片化的結果聚合到單個結果中。它提供了一個方便的抽象,用于收集子結果并在知道所有子結果后執(zhí)行某些操作。

結論

ParallelJS為我們提供了一種優(yōu)雅的方式來規(guī)避使用Web Worker時可能出現(xiàn)的問題。此外,我們獲得了一個包含一些有用抽象和輔助工具的不錯的API。將來可以集成進一步的改進。除了能夠在JavaScript中使用SMT之外,我們可能還想使用矢量化功能。如果支持,SIMD.js似乎是一種可行的方法。在某些(希望不會太遙遠的)將來,使用GPU進行計算也可能是一個有效的選項。在Node.js中存在CUDA(一種并行計算架構)的包裝器,但是仍然無法執(zhí)行原始JavaScript代碼。在那之前,ParallelJS是我們充分利用多核CPU處理長時間運行計算的最佳選擇。你呢?你如何使用JavaScript釋放現(xiàn)代硬件的強大功能?

關于使用ParallelJS的并行JavaScript的常見問題解答 (FAQ)

什么是ParallelJS,它是如何工作的?

ParallelJS是一個JavaScript庫,允許您通過利用多核處理器來并行化數據處理。它的工作原理是創(chuàng)建一個新的Parallel對象并將一個數據數組傳遞給它。然后可以使用.map()方法并行處理此數據,該方法將指定的函數應用于數組中的每個項目。然后在新的數組中返回結果。

如何安裝ParallelJS?

可以使用npm(Node.js包管理器)安裝ParallelJS。只需在終端中運行命令“npm install paralleljs”。安裝完成后,您可以使用“var Parallel = require('paralleljs');”在您的JavaScript文件中引用它。

使用ParallelJS的好處是什么?

ParallelJS允許您充分利用多核處理器進行數據處理任務。這可以大大加快大型數據集的處理時間。它還提供了一個簡單直觀的API,使并行化代碼變得容易。

我可以在瀏覽器中使用ParallelJS嗎?

是的,ParallelJS可以在瀏覽器中使用。您可以使用腳本標簽和ParallelJS文件的URL將其包含在HTML文件中。包含后,您可以像在Node.js中一樣使用Parallel對象。

如何在ParallelJS中使用.map()方法?

ParallelJS中的.map()方法用于將函數應用于數據數組中的每個項目。該函數作為字符串傳遞給.map()方法。然后在新的數組中返回結果。例如,“var p = new Parallel([1, 2, 3]); p.map('function(n) { return n * 2; }');”將返回一個值為[2, 4, 6]的新數組。

ParallelJS中的.reduce()方法是什么?

ParallelJS中的.reduce()方法用于使用指定的函數將數據數組減少為單個值。該函數作為字符串傳遞給.reduce()方法。例如,“var p = new Parallel([1, 2, 3]); p.reduce('function(a, b) { return a b; }');”將返回值6。

我可以在ParallelJS中鏈接方法嗎?

是的,ParallelJS中的方法可以鏈接在一起。例如,您可以使用.map()方法處理數據,然后使用.reduce()方法將結果組合成單個值。

如何在ParallelJS中處理錯誤?

可以使用.catch()方法處理ParallelJS中的錯誤。此方法接受一個函數,如果在處理過程中發(fā)生錯誤,則會調用該函數。錯誤對象將傳遞給此函數。

我可以將ParallelJS與其他JavaScript庫一起使用嗎?

是的,ParallelJS可以與其他JavaScript庫一起使用。但是,您需要確保使用.require()方法將庫包含在worker上下文中。

ParallelJS適用于所有數據處理任務嗎?

雖然ParallelJS可以大大加快大型數據集的處理時間,但它可能并非所有任務的最佳選擇。對于小型數據集,創(chuàng)建worker和傳輸數據的開銷可能超過并行化的益處。最好使用您的具體用例測試ParallelJS,以查看它是否提供了性能優(yōu)勢。

以上是并聯(lián)JavaScript的詳細內容。更多信息請關注PHP中文網其他相關文章!

本站聲明
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用于不同的應用場景。Java用于大型企業(yè)和移動應用開發(fā),而JavaScript主要用于網頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時間合作? 如何在JS中與日期和時間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時間處理需注意以下幾點:1.創(chuàng)建Date對象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區(qū)問題建議使用支持時區(qū)的庫,如Luxon。掌握這些要點能有效避免常見錯誤。

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

為什么要將標簽放在的底部? 為什么要將標簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript:探索用于高效編碼的數據類型 JavaScript:探索用于高效編碼的數據類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標元素,冒泡是從目標元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數設為true實現(xiàn);2.事件冒泡是默認行為,useCapture設為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動態(tài)內容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯誤處理。了解這兩個階段有助于精確控制JavaScript響應用戶操作的時機和方式。

Java和JavaScript有什么區(qū)別? Java和JavaScript有什么區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。1.Java是靜態(tài)類型、編譯型語言,適用于企業(yè)應用和大型系統(tǒng)。2.JavaScript是動態(tài)類型、解釋型語言,主要用于網頁交互和前端開發(fā)。

See all articles