CNode

关于 koa 的并发问题,寻求多个请求同时处理的解决方案。

问答
DdaGaiGuanYu发布于7 年前最后回复5 年前13 回复10115 浏览0 收藏

我按照 koa 文档里的步骤,写了几个接口,发现由于使用 await/async 请求不能被并发处理。必须一个请求处理完才能处理下一个请求,cpu 有很多空闲时间。 有没有办法解决这个问题?

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  console.log('收到请求');
  ctx.body = await getResult();
  console.log('已响应');
});

app.listen(3000);

async function getResult(){
  return new Promise( resolve => {
    setTimeout( resolve, 5000, {
      data: 'hello, world'
    });
  })
}

以上代码,在浏览器里同时打开(快速打开两个 localhost:3000),可以看到本例问题所在。

查看回复

回复 (13)

D
daGaiGuanYu#1·5 年前
引用 waitingsong@xuxu7 换个说法: 如果CPU都被占满了,此时多进程/线程模式又有何用处呢。

@waitingsong 之所以有”多线程“这种概念,是因为 cpu 资源经常闲置。 也就是说,”多线程“是 cpu 资源闲置的一种解决方案。 cpu 资源不够的情况下,多线程当然就没用了。

就像红绿灯是”指示谁该走,谁不能走“的,如果路上没有行人,那红绿灯当然没用了。 但是,不能否认红绿灯的作用。

Z
zuohuadong#4·7 年前

用 ab 做下压测,或者用不同浏览器同时打开 就明白了~

D
daGaiGuanYu#5·7 年前
引用 zuohuadong用 ab 做下压测,或者用不同浏览器同时打开 就明白了

@zuohuadong 感谢。没用过 ab……不同浏览器打开确实就没这个问题了,为什么呢?

H
hsiaosiyuan0#6·7 年前
引用 daGaiGuanYu@zuohuadong 感谢。没用过 ab……不同浏览器打开确实就没这个问题了,为什么呢?

@daGaiGuanYu 大概是浏览器有个某个优化的策略,对同一个 URL 的资源同一时间只进行一个活动请求。可以 terminal 中开几个 tab,用 curl http://127.0.0.1:3000/ 在几个 tab 中同时试一下

J
jiangli373#7·7 年前

这个问题是因为如果用chrome不同的tab打开同一个url的时候,每个tab会等待前面一个tab执行完才会执行

https://stackoverflow.com/a/14119399/1805188

https://stackoverflow.com/questions/27513994/chrome-stalls-when-making-multiple-requests-to-same-resource

D
daGaiGuanYu#8·7 年前

见笑了,我还以为是不能并发处理……

X
xuxu7#9·7 年前

楼主示例使用 ab 测试的确能并发,但为什么下面的例子(大量计算)却不能并发:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  console.log('收到请求');
  ctx.body = await getResult();
  console.log('已响应');
});

app.listen(3000);

async function getResult(){
  return new Promise( resolve => {
    let sum = Math.PI;
    for (let i = 0; i < 100000000; i++) {
      sum /= 1.2;
    }
    resolve(sum);
  })
}
X
xuxu7#11·7 年前

@waitingsong 谢谢,看了下 CPU,其中1核占用了 99.9%

W
waitingsong#12·7 年前
引用 xuxu7@waitingsong 谢谢,看了下 CPU,其中1核占用了 99.9%

@xuxu7 换个说法: 如果CPU都被占满了,此时多进程/线程模式又有何用处呢。

X
xuxu7#13·7 年前

嗯,我对 Node.js 还没有深刻的理解,想验证下异步 io,结果 CPU 占满了没能验证。

参与回复
登录后即可参与回复。登录