在 Koa 的路由中使用 await 会造成阻塞吗?
看过一篇文章说在 nodejs koa 的路由中使用await语法不会造成阻塞,但我测试了一下结果却不是这样,代码:
浏览器测试,在浏览器同时打开两个标签页,以最快手速刷新两个页面,结果:
标签页一
标签页二
标签页二 9.2s 是因为手动刷新的页面。
以上是用chrome测试的,
后来用safari测试结果是非阻塞的,为啥
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
chrome同一个url的请求会串行执行的,具体细节就不太清楚了,但是经常遇到这个问题,会被吓一跳.如果要测试建议两个浏览器.
仿照你的demo写了一下
验证了一下 ,用了谷歌,
两个标签页 ,一起刷新,最后都是5s
异步任务本就不该阻塞,会放入异步队列,根据优先级区分宏任务和微任务的。
应该是你启的是同一个服务,同一个连接;不同的tcp连接不会造成拥塞的,你可以是用两个主机试试
async/await 的目的是为了解决写代码的问题,注意,是写代码的问题,而不是解决 JS 的异步问题,JS 的异步是语言自身的特性。
async/await 就是异步,但是写法是同步的。同步就有堵塞,所以使用 async/await 写法,肯定会有堵塞问题的。
所以你的问题不是 async/await 是否会异步,而是 HTTP 是否会因为 A 客户端的长时间操作而延迟 B 客户端的操作,这个是不会的,Server 接收到一个请求时会对这个请求单独处理,换句话说,就是开一个线程来处理这个请求,再来一个请求就再开一个线程。
你可以想象一下, 如果所有的请求都要等到上一个请求结束后才能执行,那么我们每个人就都不要去访问谷歌了。所以,就是因为 Server 会对请求开一个单独的进程/线程,所以才会出现服务器扛不住的情况。如果 Server 只有一个线程处理请求,那么我们也就不需要做负载均衡了。
你使用 chrome 浏览器测试发生这种情况,可能是由于 chrome 自身的限制,你可以使用多个客户端去测试,比如 curl,chrome,opera, firefox 等。