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 图片上传预览-兼容标准
Jun 01 Javascript
精通Javascript系列之数据类型 字符串
Jun 08 Javascript
jquery+css3打造一款ajax分页插件(自写)
Jun 18 Javascript
jQuery晃动层特效实现方法
Mar 09 Javascript
jQuery实现的网格线绘制方法
Jun 20 Javascript
AngularJS 中文API参考手册
Jul 28 Javascript
ES6新特性之Symbol类型用法分析
Mar 31 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
Nov 22 Javascript
详解如何在Vue里建立长按指令
Aug 20 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
Sep 01 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
基于jQuery拖拽事件的封装
Nov 29 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
用PHP实现小型站点广告管理(修正版)
2006/10/09 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
python将文本转换成图片输出的方法
2015/04/28 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
pygame实现非图片按钮效果
2019/10/29 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
计算机通信专业推荐信
2014/02/22 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
环境建议书
2015/02/04 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
债务纠纷起诉书
2015/05/20 职场文书
Python字符串的转义字符
2022/04/07 Python