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 相关文章推荐
javascript 动态生成私有变量访问器
Dec 06 Javascript
关于include标签导致js路径找不到的问题分析及解决
Jul 09 Javascript
iframe里的页面禁止右键事件的方法
Jun 10 Javascript
使用javascript实现监控视频播放并打印日志
Jan 05 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
js+canvas绘制矩形的方法
Jan 28 Javascript
js实现拖拽功能
Mar 01 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
Bootstrap输入框组件简单实现代码
Mar 06 Javascript
Vue学习笔记之表单输入控件绑定
Sep 05 Javascript
js正则相关知识点专题
May 10 Javascript
JS在if中的强制类型转换方式
Jul 15 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
python简单获取数组元素个数的方法
2015/07/13 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
班班通校本培训方案
2014/03/12 职场文书
倡议书格式
2014/04/14 职场文书
养牛场项目建议书
2014/05/13 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
表扬通报怎么写
2015/01/16 职场文书
安徽导游词
2015/02/12 职场文书
2015年教务工作总结
2015/05/23 职场文书
法制主题班会教案
2015/08/13 职场文书
python pyhs2 的安装操作
2021/04/07 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android