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 相关文章推荐
firefox中JS读取XML文件
Dec 21 Javascript
Jquery乱码的一次解决过程 图解教程
Feb 20 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
Jan 16 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
Feb 02 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
JavaScript中关联原型链属性特性
Feb 13 Javascript
深入理解JQuery循环绑定事件
Jun 02 Javascript
微信小程序 绘图之饼图实现
Oct 24 Javascript
js实现炫酷的左右轮播图
Jan 18 Javascript
分分钟玩转Vue.js组件(二)
Mar 01 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
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
如何利用php+mysql保存和输出文件
2006/10/09 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
Python中的pprint折腾记
2015/01/21 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
Python 发送邮件方法总结
2020/08/10 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
小班评语大全
2014/05/04 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
2014年化验室工作总结
2014/11/21 职场文书
教师工作态度自我评价
2015/03/05 职场文书
岁月神偷观后感
2015/06/11 职场文书
昆虫记读书笔记
2015/06/26 职场文书
会议简讯范文
2015/07/20 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server