今天在做一個小任務(wù),需要調(diào)用阿里云的圖像識別接口,對 62662 張照片進(jìn)行場景識別,并將結(jié)果寫到本地的 csv 文件中。
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計,海珠網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:海珠等地區(qū)。海珠做網(wǎng)站價格咨詢:028-86922220
因為任務(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 倍。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當(dāng)前標(biāo)題:Node.js如何利用異步提升任務(wù)處理速度
URL網(wǎng)址:http://www.rwnh.cn/article6/pgsgig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、App設(shè)計、靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、外貿(mào)建站、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)