在 Koa 的路由中使用 await 会造成阻塞吗?

看过一篇文章说在 nodejs koa 的路由中使用await语法不会造成阻塞,但我测试了一下结果却不是这样,代码:
image.png

浏览器测试,在浏览器同时打开两个标签页,以最快手速刷新两个页面,结果:

标签页一
image.png

标签页二
image.png


标签页二 9.2s 是因为手动刷新的页面。

以上是用chrome测试的,
后来用safari测试结果是非阻塞的,为啥

阅读 1k
评论
    4 个回答
    • 615

    chrome同一个url的请求会串行执行的,具体细节就不太清楚了,但是经常遇到这个问题,会被吓一跳.如果要测试建议两个浏览器.

      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

      clipboard.png

      clipboard.png

      异步任务本就不该阻塞,会放入异步队列,根据优先级区分宏任务和微任务的。

        应该是你启的是同一个服务,同一个连接;不同的tcp连接不会造成拥塞的,你可以是用两个主机试试

          • 310

          async/await 的目的是为了解决写代码的问题,注意,是写代码的问题,而不是解决 JS 的异步问题,JS 的异步是语言自身的特性。

          async/await 就是异步,但是写法是同步的。同步就有堵塞,所以使用 async/await 写法,肯定会有堵塞问题的。

          所以你的问题不是 async/await 是否会异步,而是 HTTP 是否会因为 A 客户端的长时间操作而延迟 B 客户端的操作,这个是不会的,Server 接收到一个请求时会对这个请求单独处理,换句话说,就是开一个线程来处理这个请求,再来一个请求就再开一个线程。

          你可以想象一下, 如果所有的请求都要等到上一个请求结束后才能执行,那么我们每个人就都不要去访问谷歌了。所以,就是因为 Server 会对请求开一个单独的进程/线程,所以才会出现服务器扛不住的情况。如果 Server 只有一个线程处理请求,那么我们也就不需要做负载均衡了。

          你使用 chrome 浏览器测试发生这种情况,可能是由于 chrome 自身的限制,你可以使用多个客户端去测试,比如 curl,chrome,opera, firefox 等。

            撰写回答

            登录后参与交流、获取后续更新提醒

            相似问题
            推荐文章