内容简介:今天在做一个小任务,需要调用阿里云的图像识别接口,对 62662 张照片进行场景识别,并将结果写到本地的 csv 文件中。因为任务很简单,没想很多就开始码。自从有了本文所有代码均有简化,只保留关键过程
今天在做一个小任务,需要调用阿里云的图像识别接口,对 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 倍。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- V8 JavaScript 引擎 6.6 发布,异步性能大幅提升
- 闲鱼是如何利用 RxJava 提升异步编程能力的
- [译] Rust 异步编程方式重大升级:新版 Tokio 如何提升 10 倍性能详解
- SpringBoot | :异步开发之异步调用
- 改进异步封装:处理带返回值的异步调用
- 异步发展流程 —— Generators + co 让异步更优雅
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing for Emotion
Aarron Walter / Happy Cog / 2011-10-18 / USD 18.00
Make your users fall in love with your site via the precepts packed into this brief, charming book by MailChimp user experience design lead Aarron Walter. From classic psychology to case studies, high......一起来看看 《Designing for Emotion》 这本书的介绍吧!