真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

nodejs怎么處理密集型計(jì)算的-創(chuàng)新互聯(lián)

nodejs怎么處理密集型計(jì)算的?相信有很多人都不太了解,今天小編為了讓大家更加了解nodejs,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括安徽網(wǎng)站建設(shè)、安徽網(wǎng)站制作、安徽網(wǎng)頁(yè)制作以及安徽網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,安徽網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到安徽省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

nodejs怎么處理密集型計(jì)算的

nodejs 如何處理密集型計(jì)算?

Nodejs密集型CPU解決方案

首先說一下nodejs單線程的優(yōu)勢(shì):

高性能,與php相比,避免了頻繁創(chuàng)建切換線程的開銷,執(zhí)行更加迅速,資源占用小。

線程安全,不用擔(dān)心同一變量被多線程讀寫,造成程序崩潰。

單線程的異步和非阻塞,其實(shí) nodejs底層訪問I/O還是多線程的,阻塞/非阻塞與異步/同步是兩個(gè)不同的概念,同步不代表阻塞,但是阻塞肯定就是同步;有點(diǎn)兒繞口,請(qǐng)聽我舉例,我去食堂打飯,我選擇了A套餐,然后工作人員幫我去配餐,如果我就站在旁邊,等待工作人員給我配餐,這種情況就稱之為同步;若工作人員幫我配餐的同時(shí),排在我后面的人就開始點(diǎn)餐,這樣整個(gè)食堂的點(diǎn)餐服務(wù)并沒有因?yàn)槲以诘却鼳套餐而停止,這種情況就稱之為非阻塞。這個(gè)例子就簡(jiǎn)單說明了同步但非阻塞的情況。再如果我在等待配餐的時(shí)候去買飲料,等聽到叫號(hào)再回去拿套餐,此時(shí)我的飲料也已經(jīng)買好,這樣我在等待配餐的同時(shí)還執(zhí)行了買飲料的任務(wù),叫號(hào)就等于執(zhí)行了回調(diào),就是異步非阻塞了。如果我在買飲料的時(shí)候,已經(jīng)叫我的號(hào)讓我去拿套餐,可是我等了好久才拿到飲料,所以我可能在大廳叫我的餐號(hào)之后很久才拿到A套餐,這也就是單線程的阻塞情況。

多線程:

線程是cpu調(diào)度的一個(gè)基本單位,一個(gè)cpu只能執(zhí)行一個(gè)線程任務(wù)。

nodejs也可以執(zhí)行多行程任務(wù),例如引用TAGG/TAGG2模塊,但是不論是tagg/tagg2都是利用pthread庫(kù)和V8::Isolate類來實(shí)現(xiàn)js多線程功能的,根據(jù)規(guī)則我們?cè)诰€程里執(zhí)行的函數(shù)無法使用nodejs的核心api,例如fs,crypto模塊,所以還是有很大的局限性。

多進(jìn)程:

在支持html5的瀏覽器里,我們可以使用webworker來將一些耗時(shí)的計(jì)算丟入worker進(jìn)程中執(zhí)行,這樣主進(jìn)程就不會(huì)阻塞,用戶也不會(huì)有卡頓的感覺。

這里我們需要利用nodejs的child_process模塊,child_process提供了fork方法,可以啟動(dòng)一個(gè)nodejs文件,將它視作worker進(jìn)程,worker 工作完畢后,會(huì)把結(jié)果send給主進(jìn)程,然后worker自動(dòng)退出,這樣我們就利用了多進(jìn)程解決了主線程阻塞的問題。

var express = require('express');
var fork = require('child_process').fork;
var app = express();
app.get('/', function(req, res){
  var worker = fork('./work.js') //創(chuàng)建一個(gè)工作進(jìn)程
  worker.on('message', function(m) {//接收工作進(jìn)程計(jì)算結(jié)果
          if('object' === typeof m && m.type === 'fibo'){
                   worker.kill();//發(fā)送殺死進(jìn)程的信號(hào)
                   res.send(m.result.toString());//將結(jié)果返回客戶端
          }
  });
  worker.send({type:'fibo',num:~~req.query.n || 1});
  //發(fā)送給工作進(jìn)程計(jì)算fibo的數(shù)量
});
app.listen(7878);

我們通過express監(jiān)聽7878端口,對(duì)每個(gè)用戶的請(qǐng)求都會(huì)去fork一個(gè)子進(jìn)程,通過調(diào)用worker.send方法將參數(shù)n傳遞給子進(jìn)程,同時(shí)監(jiān)聽子進(jìn)程發(fā)送消息的message事件,將結(jié)果響應(yīng)給客戶端。

下面是被fork的work.js文件內(nèi)容:

var fibo = function fibo (n) {//定義算法
   return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
process.on('message', function(m) {
//接收主進(jìn)程發(fā)送過來的消息
          if(typeof m === 'object' && m.type === 'fibo'){
                  var num = fibo(~~m.num);
                  //計(jì)算jibo
                  process.send({type: 'fibo',result:num})
                  //計(jì)算完畢返回結(jié)果       
          }
});
process.on('SIGHUP', function() {
        process.exit();//收到kill信息,進(jìn)程退出
});

我們先定義函數(shù)fibo用來計(jì)算斐波那契數(shù)組,然后監(jiān)聽了主線程發(fā)來的消息,計(jì)算完畢之后將結(jié)果send到主線程。同時(shí)還監(jiān)聽process的SIGHUP事件,觸發(fā)此事件就進(jìn)程退出。

這里我們有一點(diǎn)需要注意,主線程的kill方法并不是真的使子進(jìn)程退出,而是會(huì)觸發(fā)子進(jìn)程的SIGHUP事件,真正的退出還是依靠process.exit()。

總結(jié):

使用child_process模塊的fork方法確實(shí)可以讓我們很好的解決單線程對(duì)cpu密集型任務(wù)的阻塞問題,同時(shí)又沒有tagg包那樣無法使用Node.js核心api的限制。

單線程異步的Node.js不代表不會(huì)阻塞,在主線程做過多的任務(wù)可能會(huì)導(dǎo)致主線程的卡死,影響整個(gè)程序的性能,所以我們要非常小心的處理大量的循環(huán),字符串拼接和浮點(diǎn)運(yùn)算等cpu密集型任務(wù),合理的利用各種技術(shù)把任務(wù)丟給子線程或子進(jìn)程去完成,保持Node.js主線程的暢通。

線程/進(jìn)程的使用并不是沒有開銷的,盡可能減少創(chuàng)建和銷毀線程/進(jìn)程的次數(shù),可以提升我們系統(tǒng)整體的性能和出錯(cuò)的概率。

以上就是nodejs怎么處理密集型計(jì)算的的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


新聞名稱:nodejs怎么處理密集型計(jì)算的-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://weahome.cn/article/dcgdjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部