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

发布于 2022-09-11 23:16:22 字数 487 浏览 66 评论 0

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

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

标签页一
image.png

标签页二
image.png


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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

哆啦不做梦 2022-09-18 23:16:22

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

衣神在巴黎 2022-09-18 23:16:22
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

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

日裸衫吸 2022-09-18 23:16:22

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

此生挚爱伱 2022-09-18 23:16:22

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

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文