91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-03-01 09:47:24 來源:億速云 閱讀:249 作者:iii 欄目:web開發

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

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

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

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

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

node本身分為三層

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

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

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

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

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

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

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會調用cpu進行大量的計算,這時如果有其他http請求進入,將會發生阻塞。

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

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

多進程 vs 多線程

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

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

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

//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
}
//發送信息
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的多進程和多線程是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

禹州市| 弥勒县| 延安市| 讷河市| 谷城县| 和硕县| 灵武市| 岳普湖县| 秦安县| 湄潭县| 六安市| 渝中区| 通海县| 威远县| 临漳县| 洪雅县| 拉孜县| 西峡县| 女性| 平邑县| 平谷区| 克山县| 安龙县| 霍林郭勒市| 抚宁县| 黎城县| 民乐县| 宝坻区| 乐东| 海兴县| 澳门| 淳化县| 陇西县| 正宁县| 衡南县| 南京市| 泾源县| 文山县| 南召县| 永宁县| 铜陵市|