JS明明写的请求是并行,为何仍然串行请求?
环境
测试环境:electron + vue + axios
需求
想要做并行请求(比如爬虫)需要尽量快的请求页面。
假如一次发出请求到返回所需时间为100ms:
方案1(串行):请求一次接口等待返回处理结果后继续下一次请求。这样会受制于请求的速度,假如请求100次那么需要总时间为100ms * 100 = 10000ms
方案2(并行):利用Promise,同时发起多个请求,但不等待每个请求结束。而是Promise.all等待其全部结束再进行处理。假如请求100次那么需要总时间为100ms * 1= 100ms
可以看出速度有极大的提升,理论上(实际需要看机器配置和网络带宽情况)无论多少请求都只需要100ms。
并行实现
我们的需求就是方案2的并行实现。所以如下实现:
async t () { const time1 = new Date().getTime() / 1000 const task = [] for (let i=0; i < 100; i++){ task.push(this.t1()) // 发起请求 } await Promise.all(task) // 等待所有请求结束 // await this.$http.all(task) // 与Promise一样 const time2 = new Date().getTime() / 1000 console.log('time:', time2 - time1) }, async t1 () { const res = await this.$http({ method: 'get', baseURL: this.url, url: LOGIN_PATH, // 关键:正常url }) }
结果仍然是串行?
查看console程序的time输出很高,是所有请求时间累加的时间。
查看network,从time和waterfall也可以明显看出,
- 所有请求的开始时间点是一样的
- 但是后续请求都有等待时间(灰色),都是上一个请求开始到结束时间
- 每个请求的真正时间(绿色)几乎一样,但总时长越往后请求越慢,都是上一个请求结束才开始下一个
- 以上看出完全是串行请求,并没有达到我们的预期
network图如下:
问题在哪?
我们都知道浏览器中请求都应该是并行的,html中加载网络文件和请求也通常都是并行的。
观察发现这里所有经过url都是一致的,而一般网页开发时很少出现一个页面请求多次同样的url的,所以这里很可疑。
经过尝试,将每次url都改为不完全一样,确实解决了此问题。(怀疑是浏览器的问题,非axios问题。而之后使用node版的got未发现此问题)
修改代码,请求的url增加随机参数使其完整url每次都发生变化,修改部分代码如下:
async t1 () { const res = await this.$http({ method: 'get', baseURL: this.url, // url: LOGIN_PATH, // 关键:正常url url: LOGIN_PATH + `?v=${Math.random()}`, // 关键:增加随机参数 }) }
查看console的程序输出时间已经为几乎只有一个请求的时间。
查看network所有请求也都同时开始,也几乎(网络因素影响,不可能每次时间都一样)同时结束,总耗时只有200ms多
查询资料及测试发现,“chrome + jquery”并行请求看起来是6个一块,与资料所述chrome浏览器http最大连接数为6一致,基本可以判定这次主要问题在于浏览器或者electron(实际扔使用的chrome内核)连接数有关,还有些问题,比如如何修改连接数等这里不再深究。一些参考资料如下:
electron中使用got未发现此问题,这个库是node环境库,可能不经过chrome内核

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
走出PPT,智能制造如何真正落地?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 自18世纪第一次工业革命以来,工业已经走过机械化、 电气自动化、数字化三个阶段。如今,几乎所有日常生活方式背后都离不开工业的力量。 不过,在“效率就是生命”的现代语境里,留给工业的提升空间还很多,世界各国也都发布过工业转型计划,且思路大同小异:依托物联网、大数据等新兴技术,提升制造业的智能化、效率和互联互通。 具体到中国的情况,随着人口老龄化、劳动力成本提升,仅靠人口红利实现高速增长的日子一去不复返,国内制造业需要找到新的引擎,产业升级迫切。 挑战与机遇并存,产业升级意味着存在可观的市场空间,嗅到机遇的资本和创业公司早已有所布局,联想创投及其被投企业便是典型代表。 传统制造业升级迫切用一句话概括传统制造业的痛点便是:成本高但效率较低。 而成本和效率之间的问题一般表现为:产能过剩、生产灵活性不足、运维成本过高等。 产能过剩是国内老生常谈的话题,根据国际通用的标准,工业产能利用率低于79%即为“产能过剩”,但从国家统计局公布的数据来看,我国工业产业利用率一直处于79%以下。在以制造业著称的德...
- 下一篇
JVM系列之:详解java object对象在heap中的结构
点击上方的蓝字关注我吧 程序那些事 简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。 今天,我们会更进一步,剖析一下在之前文章中没有讲解到的更深层次的细节。一起来看看吧。 对象和其隐藏的秘密 java.lang.Object大家应该都很熟悉了,Object是java中一切对象的鼻祖。 接下来我们来对这个java对象的鼻祖进行一个详细的解剖分析,从而理解JVM的深层次的秘密。 工具当然是使用JOL: @Slf4jpublic class JolUsage { @Test public void useJol(){ log.info("{}", VM.current().details()); log.info("{}", ClassLayout.parseClass(Object.class).toPrintable()); log.info("{}", ClassLayout.parseInstance(new Object()).toPrintable()); }} 代码很简单,我们打印JVM的信息,Object class和...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音