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 相关文章推荐
用js实现的仿sohu博客更换页面风格(简单版)
Mar 22 Javascript
select组合框option的捕捉实例代码
Sep 30 Javascript
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
javascript顺序加载图片的方法
Jul 18 Javascript
JS中取二维数组中最大值的方法汇总
Apr 17 Javascript
详解node HTTP请求客户端 - Request
May 05 Javascript
npm国内镜像 安装失败的几种解决方案
Jun 04 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
详解10分钟学会vue滚动行为
Sep 21 Javascript
vue中动态select的使用方法示例
Oct 28 Javascript
vue实现简易的双向数据绑定
Dec 29 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
cookie的secure属性详解
2015/04/08 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
python友情链接检查方法
2015/07/08 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
Python交互环境下实现输入代码
2018/06/22 Python
Python lambda表达式用法实例分析
2018/12/25 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
python中sys模块是做什么用的
2020/08/16 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
汇智创新科技发展有限公司
2015/12/06 面试题
公共事业管理本科生求职信
2013/10/07 职场文书
思想品德自我评价
2014/02/04 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
工人先进事迹材料
2014/12/26 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书
承诺书范本大全
2015/05/04 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python