最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年01月07日 08:19:49   作者:全棧漸進(jìn)之路  
這篇文章主要介紹了Node.js 如何利用異步提升任務(wù)處理速度,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

因?yàn)槿蝿?wù)很簡(jiǎn)單,沒(méi)想很多就開(kāi)始碼。自從有了 async/await 之后,已經(jīng)很久不寫(xiě) callback 了,所以上手就寫(xiě)成這樣:

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

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)行起來(lái)以后沒(méi)問(wèn)題就放著忙別的去了。過(guò)了差不多 2 小時(shí)回來(lái)一看,才跑了 17180 張圖,每分鐘 144 張。這才意識(shí)到同步速度太慢了,于是停掉進(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);
}

跑了一下,直接停擺了。嗯,不能一下把請(qǐng)求全發(fā)出去,加一個(gè) 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);
}

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

慈利县| 深泽县| 湟源县| 大关县| 吐鲁番市| 雷州市| 巩义市| 苏州市| 南木林县| 博湖县| 雷州市| 清流县| 潞城市| 甘洛县| 扎赉特旗| 新安县| 广南县| 南乐县| 澄城县| 唐山市| 固安县| 鹿泉市| 高密市| 梧州市| 定边县| 大港区| 宜兰市| 隆化县| 鄂托克旗| 利辛县| 乳山市| 湘阴县| 禹州市| 浮山县| 城步| 成都市| 崇信县| 临高县| 页游| 景东| 竹山县|