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 相关文章推荐
处理及遍历XML文档DOM元素属性及方法整理
Aug 23 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
easyui combogrid实现本地模糊搜索过滤多列
May 13 Javascript
微信小程序canvas写字板效果及实例
Jun 15 Javascript
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
vue router+vuex实现首页登录验证判断逻辑
May 17 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
JavaScript常见鼠标事件与用法分析
Jan 03 Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 jQuery
vue中activated的用法
Jan 03 Vue.js
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中的比较运算符详解
2013/10/28 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
详谈js模块化规范
2017/07/07 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
React中的render何时执行过程
2018/04/13 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
深入理解Python中字典的键的使用
2015/08/19 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
python下载的库包存放路径
2020/07/27 Python
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
STP的判定过程
2012/10/01 面试题
家长学校实施方案
2014/03/15 职场文书
创先争优个人承诺书
2014/08/30 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
求职自我评价范文100字
2014/09/23 职场文书
英语教师求职信范文
2015/03/20 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技