最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Node.js 如何利用異步提升任務(wù)處理速度

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:02:18
文檔

Node.js 如何利用異步提升任務(wù)處理速度

Node.js 如何利用異步提升任務(wù)處理速度:今天在做一個小任務(wù),需要調(diào)用阿里云的圖像識別接口,對 62662 張照片進(jìn)行場景識別,并將結(jié)果寫到本地的 csv 文件中。 因為任務(wù)很簡單,沒想很多就開始碼。自從有了 async/await 之后,已經(jīng)很久不寫 callback 了,所以上手就寫成這樣: 本文所有代碼均有簡化
推薦度:
導(dǎo)讀Node.js 如何利用異步提升任務(wù)處理速度:今天在做一個小任務(wù),需要調(diào)用阿里云的圖像識別接口,對 62662 張照片進(jìn)行場景識別,并將結(jié)果寫到本地的 csv 文件中。 因為任務(wù)很簡單,沒想很多就開始碼。自從有了 async/await 之后,已經(jīng)很久不寫 callback 了,所以上手就寫成這樣: 本文所有代碼均有簡化

今天在做一個小任務(wù),需要調(diào)用阿里云的圖像識別接口,對 62662 張照片進(jìn)行場景識別,并將結(jié)果寫到本地的 csv 文件中。

因為任務(wù)很簡單,沒想很多就開始碼。自從有了 async/await 之后,已經(jīng)很久不寫 callback 了,所以上手就寫成這樣:

本文所有代碼均有簡化,只保留關(guān)鍵過程

async fetchSceneTags(imagePath) {
 try {
 const result = await callAliyunAPI(imagePath);
 return result.errno === 0 ? result.tags : [];
 } catch(error) {
 return []; 
 }
}

async function writeScene(paths) {
 for (let i = 0, len = paths.length; i < len; i++) {
 await tags = fetchSceneTags(paths[i])
 writeToFile(tags);
 writeStdout(`${i} / ${len}`);
 }
}

function start() {
 const paths = loadPaths();
 writeScene(paths);
}

運(yùn)行起來以后沒問題就放著忙別的去了。過了差不多 2 小時回來一看,才跑了 17180 張圖,每分鐘 144 張。這才意識到同步速度太慢了,于是停掉進(jìn)程,將代碼改成下面這樣:

fetchSceneTagsAsync(imagePath, callback) {
 callAliyunAPI(imagePath)
 .then(result => {
 const tags = result.errno === 0 ? result.tags : [];
 callback(tags);
 })
 .catch(error => callback([]));
}

function writeSceneAsync(paths) {
 const callback = tags => {
 await tags = fetchSceneTagsAsync(paths[i])
 writeToFile(tags);
 }
 
 paths.forEach(path => fetchSceneTagsAsync(path, callback));
}

function start() {
 const paths = loadPaths();
 writeSceneAsync(paths);
}

跑了一下,直接停擺了。嗯,不能一下把請求全發(fā)出去,加一個 Throttle:

fetchSceneTagsAsync(imagePath, callback) {
 callAliyunAPI(imagePath)
 .then(result => {
 const tags = result.errno === 0 ? result.tags : [];
 callback(tags);
 })
 .catch(error => callback([]));
}

function throttle(paths, callback) {
 if(paths.length === 0) return;
 
 const sub = paths.splice(0, 10);
 sub.forEach(path => fetchSceneTagsAsync(path, callback));
 setTimeout(() => throttle(paths, callback), 1000)
}

function writeSceneAsync(paths) {
 const callback = tags => {
 await tags = fetchSceneTagsAsync(paths[i])
 writeToFile(tags);
 }
 
 throttle(paths, callback)
}

function start() {
 const paths = loadPaths();
 writeSceneAsync(paths);
}

重新啟動服務(wù),觀察了一下,大約每分鐘處理 568 張圖片,速度提升約 4 倍。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Node.js 如何利用異步提升任務(wù)處理速度

Node.js 如何利用異步提升任務(wù)處理速度:今天在做一個小任務(wù),需要調(diào)用阿里云的圖像識別接口,對 62662 張照片進(jìn)行場景識別,并將結(jié)果寫到本地的 csv 文件中。 因為任務(wù)很簡單,沒想很多就開始碼。自從有了 async/await 之后,已經(jīng)很久不寫 callback 了,所以上手就寫成這樣: 本文所有代碼均有簡化
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top