我按照 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),可以看到本例问题所在。
用 ab 做下压测,或者用不同浏览器同时打开 就明白了~
@zuohuadong 感谢。没用过 ab……不同浏览器打开确实就没这个问题了,为什么呢?
@daGaiGuanYu 大概是浏览器有个某个优化的策略,对同一个 URL 的资源同一时间只进行一个活动请求。可以 terminal 中开几个 tab,用 curl http://127.0.0.1:3000/
在几个 tab 中同时试一下
这个问题是因为如果用chrome不同的tab打开同一个url的时候,每个tab会等待前面一个tab执行完才会执行
见笑了,我还以为是不能并发处理……
楼主示例使用 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);
})
}
@xuxu7 高CPU计算把主进程占满了,怎么能并发呢
@waitingsong 谢谢,看了下 CPU,其中1核占用了 99.9%
@xuxu7 换个说法: 如果CPU都被占满了,此时多进程/线程模式又有何用处呢。
嗯,我对 Node.js 还没有深刻的理解,想验证下异步 io,结果 CPU 占满了没能验证。
@waitingsong 之所以有”多线程“这种概念,是因为 cpu 资源经常闲置。 也就是说,”多线程“是 cpu 资源闲置的一种解决方案。 cpu 资源不够的情况下,多线程当然就没用了。
就像红绿灯是”指示谁该走,谁不能走“的,如果路上没有行人,那红绿灯当然没用了。 但是,不能否认红绿灯的作用。
@daGaiGuanYu 你的理解方向不对,应该是: 如果路上人山人海道路塞满车,那么“此时”红绿灯就没用了。
@waitingsong 这是打个比方啊大兄弟,这也能较劲