node的多進程和多線程是什么

今天小編給大家分享一下node的多進程和多線程是什么的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設、網(wǎng)站重做改版、長沙縣網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5高端網(wǎng)站建設、成都做商城網(wǎng)站、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為長沙縣等各大城市提供網(wǎng)站開發(fā)制作服務。

node的多進程和多線程是什么

node.js中的多進程與多線程

在node.js中,javascript代碼的執(zhí)行是單線程執(zhí)行的,可是Node 本身其實是多線程的。

node的多進程和多線程是什么

node本身分為三層

第一層,Node.js 標準庫,這部分是由 Javascript編寫的,即我們使用過程中直接能調(diào)用的 API,在源碼中的 lib 目錄下可以看到。

第二層,Node bindings,這一層是 Javascript 與底層 C/C++ 能夠溝通的關鍵,前者通過 bindings 調(diào)用后者,相互交換數(shù)據(jù),是第一層和第三層的橋梁。

第三層,是支撐 Node.js 運行的關鍵,由 C/C++ 實現(xiàn),是node實現(xiàn)的一些底層邏輯。

其中,第三層的Libuv,為 Node.js 提供了跨平臺,線程池,事件池,異步 I/O 等能力,是 Node.js 如此強大的關鍵。

由于Libuv提供了事件循環(huán)機制,所以在io處理方面,javascript并不會發(fā)生阻塞,所以我們用node搭建web服務時,并不需要擔心io量過大,導致其他請求阻塞。

可是,非io任務的執(zhí)行,是在node主線程中執(zhí)行的,是單線程執(zhí)行任務,如果有非常消耗時間的同步計算任務,將會阻塞其他代碼的執(zhí)行。

const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === '/') {
        ctx.body = {name: 'xxx', age: 14}
    }
    if(url==='/compute'){
        let sum=0
        for (let i = 0; i <100000000000 ; i++) {
        sum+=i    
        }
        ctx.body={sum}
    }
})
app.listen(4000, () => {
    console.log('http://localhost:4000/ start')
})

上面這串代碼,如果http請求了 /compute ,node會調(diào)用cpu進行大量的計算,這時如果有其他http請求進入,將會發(fā)生阻塞。

那么如何解決這個問題呢?

有兩種方案,一種是使用children_process或者cluster開啟多進程進行計算,一種是使用worker_thread 開啟多線程進行計算

多進程 vs 多線程

對比一下多線程與多進程:

屬性多進程多線程比較
數(shù)據(jù)數(shù)據(jù)共享復雜,需要用IPC;數(shù)據(jù)是分開的,同步簡單因為共享進程數(shù)據(jù),數(shù)據(jù)共享簡單,同步復雜各有千秋
CPU、內(nèi)存占用內(nèi)存多,切換復雜,CPU利用率低占用內(nèi)存少,切換簡單,CPU利用率高多線程更好
銷毀、切換創(chuàng)建銷毀、切換復雜,速度慢創(chuàng)建銷毀、切換簡單,速度很快多線程更好
coding編碼簡單、調(diào)試方便編碼、調(diào)試復雜編碼、調(diào)試復雜
可靠性進程獨立運行,不會相互影響線程同呼吸共命運多進程更好
分布式可用于多機多核分布式,易于擴展只能用于多核分布式多進程更好

采用多線程來解決上面代碼的計算問題:

//api.js
const Koa = require('koa');
const app = new Koa();

const {Worker} = require('worker_threads')
app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === '/') {
        ctx.body = {name: 'xxx', age: 14}
    }

    if (url === '/compute') {
        const sum = await new Promise(resolve => {
            const worker = new Worker(__dirname+'/compute.js')
          //接收信息
            worker.on('message', data => {
                resolve(data)
            })
        })
        ctx.body = {sum}

    }
})
app.listen(4000, () => {
    console.log('http://localhost:4000/ start')
})



//computer.js
const {parentPort}=require('worker_threads')
let sum=0
for (let i = 0; i <1000000000 ; i++) {
    sum+=i
}
//發(fā)送信息
parentPort.postMessage(sum)

采用多進程來解決上面代碼的計算問題:

//api.js
const Koa = require('koa');
const app = new Koa();
const {fork} = require('child_process')

app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === '/') {
        ctx.body = {name: 'xxx', age: 14}
    }

    if (url === '/compute') {
        const sum = await new Promise(resolve => {
          const worker =fork(__dirname+'/compute.js')
            worker.on('message', data => {
                resolve(data)
            })
        })
        ctx.body = {sum}

    }
})
app.listen(4000, () => {
    console.log('http://localhost:4000/ start')
})

//computer.js
let sum=0
for (let i = 0; i <1000000000 ; i++) {
    sum+=i
}
process.send(sum)

以上就是“node的多進程和多線程是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱:node的多進程和多線程是什么
標題網(wǎng)址:http://bm7419.com/article0/ijpdio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、、定制網(wǎng)站、網(wǎng)站營銷、做網(wǎng)站、響應式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)