亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
什麼是ParallelJS,它是如何工作的?
如何安裝ParallelJS?
使用ParallelJS的好處是什麼?
我可以在瀏覽器中使用ParallelJS嗎?
如何在ParallelJS中使用.map()方法?
ParallelJS中的.reduce()方法是什麼?
我可以在ParallelJS中鏈接方法嗎?
如何在ParallelJS中處理錯誤?
我可以將ParallelJS與其他JavaScript庫一起使用嗎?
ParallelJS適用於所有數(shù)據(jù)處理任務(wù)嗎?
首頁 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)雅的解決方案,它提供了一個具有便捷抽象和輔助工具的實(shí)用API。 HTML5引入的Worker接口允許創(chuàng)建具有較長運(yùn)行時間和高計算量需求的函數(shù),這些函數(shù)可以同時使用以提高網(wǎng)站響應(yīng)速度。 ParallelJS允許對JavaScript代碼進(jìn)行並行化處理,利用同時多線程 (SMT) 更有效地使用現(xiàn)代CPU。 ParallelJS庫提供諸如spawn、mapreduce等方法,分別用於並行執(zhí)行計算、處理數(shù)據(jù)和聚合碎片化結(jié)果。

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

為什麼需要多線程?

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

Parallel JavaScript with ParallelJS

為了使用SMT,我們需要編寫並行代碼,即為獲得單個結(jié)果而並行運(yùn)行的代碼。我們通常需要考慮特殊的算法,因?yàn)榇蠖鄶?shù)順序代碼要么很難並行化,要么效率非常低。原因在於Amdahl定律,該定律指出加速比S由下式給出:

Parallel JavaScript with ParallelJS

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

JavaScript中的多線程

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

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

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

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)在,我們只需要在主應(yīng)用程序中使用以下代碼來啟動後臺工作器即可。

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));
}

相當(dāng)多的工作。尤其令人討厭的是使用另一個文件。這產(chǎn)生了很好的分離,但對於較小的任務(wù)似乎完全是多餘的。幸運(yùn)的是,有一種解決方法??紤]以下代碼:

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

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

ParallelJS能幫上忙嗎?

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

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

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

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

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

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++;
    }
}

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

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函數(shù)有助於將碎片化的結(jié)果聚合到單個結(jié)果中。它提供了一個方便的抽象,用於收集子結(jié)果並在知道所有子結(jié)果後執(zhí)行某些操作。

結(jié)論

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

關(guān)於使用ParallelJS的並行JavaScript的常見問題解答 (FAQ)

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

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

如何安裝ParallelJS?

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

使用ParallelJS的好處是什麼?

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

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

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

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

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

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

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

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

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

如何在ParallelJS中處理錯誤?

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

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

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

ParallelJS適用於所有數(shù)據(jù)處理任務(wù)嗎?

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

以上是並聯(lián)JavaScript的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場景,但需手動處理數(shù)據(jù)拼接和錯誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請求;2.axios是基於Promise的第三方庫,語法簡潔且功能強(qiáng)大,支持async/await、自動JSON轉(zhuǎn)換、攔截器等,推薦用於簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語法簡單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

React與Angular vs Vue:哪個JS框架最好? React與Angular vs Vue:哪個JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個JavaScript框架最好?答案是根據(jù)需求選擇最適合的。 1.React靈活自由,適合需要高度定制、團(tuán)隊有架構(gòu)能力的中大型項目;2.Angular提供完整解決方案,適合企業(yè)級應(yīng)用和長期維護(hù)的大項目;3.Vue上手簡單,適合中小型項目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊規(guī)模、項目生命週期及是否需要SSR也都是選擇框架的重要因素??傊?,沒有絕對最好的框架,適合自己需求的就是最佳選擇。

JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標(biāo)之爭Oracle試圖註冊“JavaScript”商標(biāo)的舉動引發(fā)爭議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請願書,要求取消該商標(biāo),他認(rèn)為JavaScript是一個開放標(biāo)準(zhǔn),不應(yīng)由Oracle

處理諾言:鏈接,錯誤處理和承諾在JavaScript中 處理諾言:鏈接,錯誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鍊式調(diào)用、錯誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個.then()接收上一步結(jié)果並可返回值或Promise;2.錯誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個完成即返回)和Promise.allSettled()(等待所有完成)

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。 1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺更新內(nèi)容;6.使用時需注意緩存版本控制、存儲限制及與HTTP緩存機(jī)制的區(qū)別。

利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡化數(shù)據(jù)處理;1).map()用於一對一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用於聚合數(shù)據(jù)為單一值;使用時應(yīng)避免誤用導(dǎo)致副作用或性能問題。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊列來管理異步操作。 1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時交由WebAPI處理;2.WebAPI在後臺完成任務(wù)後將回調(diào)放入相應(yīng)的隊列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先於宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助於避免阻塞主線程並優(yōu)化代碼執(zhí)行順序。

See all articles