Node.js 如何利用异步提升任务处理速度


Posted in Javascript onJanuary 07, 2019

今天在做一个小任务,需要调用阿里云的图像识别接口,对 62662 张照片进行场景识别,并将结果写到本地的 csv 文件中。

因为任务很简单,没想很多就开始码。自从有了 async/await 之后,已经很久不写 callback 了,所以上手就写成这样:

本文所有代码均有简化,只保留关键过程

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);
}

跑了一下,直接停摆了。嗯,不能一下把请求全发出去,加一个 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);
}

重新启动服务,观察了一下,大约每分钟处理 568 张图片,速度提升约 4 倍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery 的一个progressbar widge
Oct 29 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 Javascript
js实现索引图片切换效果
Nov 21 Javascript
浅谈JS中的反柯里化( uncurrying)
Aug 17 Javascript
vue移动UI框架滑动加载数据的方法
Mar 12 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
VUE+Element环境搭建与安装的方法步骤
Jan 24 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
jQuery实现简易聊天框
Feb 08 jQuery
Vue 实现v-for循环的时候更改 class的样式名称
Jul 17 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
vue封装一个简单的div框选时间的组件的方法
Jan 06 #Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
Jan 06 #Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 #Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 #Javascript
react-router4按需加载(踩坑填坑)
Jan 06 #Javascript
React 实现拖拽功能的示例代码
Jan 06 #Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 #Javascript
You might like
JAVA/JSP学习系列之六
2006/10/09 PHP
PHP多文件上传类实例
2015/03/07 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
详解React中setState回调函数
2018/06/14 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
Python md5与sha1加密算法用法分析
2017/07/14 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
python线程信号量semaphore使用解析
2019/11/30 Python
基于python监控程序是否关闭
2020/01/14 Python
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
开学典礼感言
2014/02/16 职场文书
婚礼主持词
2014/03/13 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
影视广告专业求职信
2014/09/02 职场文书
党员倡议书
2015/01/19 职场文书
监察建议书
2015/02/04 职场文书
安全教育第一课观后感
2015/06/17 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript