欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js使用多進程提高任務執(zhí)行效率

 更新時間:2022年09月24日 09:41:45   作者:代碼與野獸  
在Node.JS中使用多進程非常簡單,合理使用多進程,可以解放硬件的能力,讓軟件的運行效率得到肉眼可見的提升。本文詳細講解了Node.js使用多進程提高任務執(zhí)行效率的方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

最近我有個學員寫了個 Node.js 腳本程序,定時從某個服務器下載文件,并向另一個云服務商上傳文件。

但是每次只能先下載一個文件,再去上傳一個文件。效率比較低。于是他向我請教,怎么樣才能提高效率?我告訴他應該用 Node 的多進程技術。

什么是 Node 多進程?

Node 是在單個線程中運行,我們雖然沒辦法開啟額外的線程,但是可以開啟進程集群。這樣可以讓下載任務和上傳任務同時進行。

使用多進程進行初步代碼優(yōu)化

簡單看了一下學員的代碼,大概是這樣:

const dl = require('./download.js')
const ul = require('./upload.js')
const source = require('./source.js')

async function runTask() {
  const { originUrl, targetUrl } = source.getNext()
  const { data } = await dl(originUrl)
  await ul(targetUrl, data)
  runTask()
}

runTask()

這個代碼邏輯上是沒問題的,但是它只能在 1 個 CPU 核心中運行。

我們完全可以使用 Node.js 的多進程來利用 CPU 的多核心來增加這個程序的吞吐量。

怎么改造呢?

也非常簡單。

const os = require('os')
const cluster = require('cluster')
const dl = require('./download.js')
const ul = require('./upload.js')
const source = require('./source.js')

function run() {
  if(cluster.isMaster) {
    const numCPUs = os.cpus().length;
    for(let idx = 0; idx < numCPUs; idx++) {
      cluster.fork();
    }
  } else {
    runTask()
  }
}

async function runTask() {
    const { originUrl, targetUrl } = source.getNext()
    const { data } = await dl(originUrl)
    await ul(targetUrl, data)
    runTask()
  }
}

run()

在上面的代碼中,我添加了 os 和 cluster 模塊。os 模塊可以告訴我們運行環(huán)境的 CPU 信息,我們可以通過它來做為創(chuàng)建進程數(shù)量的限制條件。然后通過 cluster.isMaster 來判斷是否是主進程,因為只有主進程才擁有 fork 的能力。

worker和master通信

其實上面的代碼還可以繼續(xù)做更深層次的優(yōu)化,仔細分析一下,下載速度和上傳速度其實是不一致的。通常來說,下載速度會很慢,但上傳速度會很快。我們可以讓其他進程去下載文件,當下載成功之后,讓主進程去上傳文件。

Node 中的多進程之間不會共享內存,所以我們可以通過消息傳遞的方式,讓下載進程通知主進程去上傳文件。

const os = require('os')
const cluster = require('cluster')
const dl = require('./download.js')
const ul = require('./upload.js')
const source = require('./source.js')

function run() {
  if(cluster.isMaster) {
    const numCPUs = os.cpus().length;
    for(let idx = 0; idx < numCPUs; idx++) {
      const worker = cluster.fork();
      worker.on('message', ({ targetUrl, data }) => {
        ul(targetUrl, data)
      })
    }
  } else {
    runTask()
  }
}

async function runTask() {
  const { originUrl, targetUrl } = source.getNext()
  const { data } = await dl(originUrl)
  process.send({ targetUrl, data })
  runTask()
}

run()

可以在主進程中通過 worker.on('message', (msg)=>{}) 的方式來監(jiān)聽子進程發(fā)送的消息。在子進程中通過 process.send 來向主進程發(fā)送消息。

總結

在 NodeJS 中使用多進程非常簡單,合理使用多進程,可以解放硬件的能力,讓軟件的運行效率得到肉眼可見的提升。

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

最新評論