看过一篇文章说在 nodejs koa 的路由中使用await语法不会造成阻塞,但我测试了一下结果却不是这样,代码:
浏览器测试,在浏览器同时打开两个标签页,以最快手速刷新两个页面,结果:
标签页一
标签页二
标签页二 9.2s 是因为手动刷新的页面。
以上是用chrome测试的,
后来用safari测试结果是非阻塞的,为啥
看过一篇文章说在 nodejs koa 的路由中使用await语法不会造成阻塞,但我测试了一下结果却不是这样,代码:
浏览器测试,在浏览器同时打开两个标签页,以最快手速刷新两个页面,结果:
标签页一
标签页二
标签页二 9.2s 是因为手动刷新的页面。
以上是用chrome测试的,
后来用safari测试结果是非阻塞的,为啥
var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
//实例化
var app=new Koa();
function test(time){
return new Promise(res=>{
setTimeout(res,time)
})
}
router.get('/',async (ctx)=>{
await test(ctx.request.query.ms)
ctx.body="首页";
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);
仿照你的demo写了一下
验证了一下 ,用了谷歌,
两个标签页 ,一起刷新,最后都是5s
异步任务本就不该阻塞,会放入异步队列,根据优先级区分宏任务和微任务的。
async/await 的目的是为了解决写代码的问题,注意,是写代码的问题,而不是解决 JS 的异步问题,JS 的异步是语言自身的特性。
async/await 就是异步,但是写法是同步的。同步就有堵塞,所以使用 async/await 写法,肯定会有堵塞问题的。
所以你的问题不是 async/await 是否会异步,而是 HTTP 是否会因为 A 客户端的长时间操作而延迟 B 客户端的操作,这个是不会的,Server 接收到一个请求时会对这个请求单独处理,换句话说,就是开一个线程来处理这个请求,再来一个请求就再开一个线程。
你可以想象一下, 如果所有的请求都要等到上一个请求结束后才能执行,那么我们每个人就都不要去访问谷歌了。所以,就是因为 Server 会对请求开一个单独的进程/线程,所以才会出现服务器扛不住的情况。如果 Server 只有一个线程处理请求,那么我们也就不需要做负载均衡了。
你使用 chrome 浏览器测试发生这种情况,可能是由于 chrome 自身的限制,你可以使用多个客户端去测试,比如 curl,chrome,opera, firefox 等。
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
3 回答818 阅读✓ 已解决
chrome同一个url的请求会串行执行的,具体细节就不太清楚了,但是经常遇到这个问题,会被吓一跳.如果要测试建议两个浏览器.