今天在做一個小任務(wù),需要調(diào)用阿里云的圖像識別接口,對 62662 張照片進行場景識別,并將結(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);
}
運行起來以后沒問題就放著忙別的去了。過了差不多 2 小時回來一看,才跑了 17180 張圖,每分鐘 144 張。這才意識到同步速度太慢了,于是停掉進程,將代碼改成下面這樣:
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)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當前標題:Node.js如何利用異步提升任務(wù)處理速度
URL網(wǎng)址:http://www.chinadenli.net/article6/pgsgig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、App設(shè)計、靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、外貿(mào)建站、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)