Ecmascript 6 KoaJS阻塞主线程 我有以下膝关节炎性疾病的服务器< /P> const koa = require('koa'); const router = require('koa-router')(); // Intialize the base application const app = koa(); // Define the logger function app.use(function *(next) { console.log('Start processing'); // before (Downstream) var timestampBefore = new Date().getTime(); yield next; // After (Upstream) var timestampAfter = new Date().getTime(); var difference = timestampAfter - timestampBefore; console.log("Processing took " + difference + "ms"); }); // Intialize router app .use(router.routes()) .use(router.allowedMethods()); router.get('/users', function *() { yield new Promise((resolve, reject) => { setTimeout(() => resolve(this.body = ['User 1', 'User 2']), 3000); }); }); app.listen(3000, () => console.log('Server Listening'));

Ecmascript 6 KoaJS阻塞主线程 我有以下膝关节炎性疾病的服务器< /P> const koa = require('koa'); const router = require('koa-router')(); // Intialize the base application const app = koa(); // Define the logger function app.use(function *(next) { console.log('Start processing'); // before (Downstream) var timestampBefore = new Date().getTime(); yield next; // After (Upstream) var timestampAfter = new Date().getTime(); var difference = timestampAfter - timestampBefore; console.log("Processing took " + difference + "ms"); }); // Intialize router app .use(router.routes()) .use(router.allowedMethods()); router.get('/users', function *() { yield new Promise((resolve, reject) => { setTimeout(() => resolve(this.body = ['User 1', 'User 2']), 3000); }); }); app.listen(3000, () => console.log('Server Listening'));,ecmascript-6,koa,Ecmascript 6,Koa,我同时从两个客户端访问/users端点。我希望它不会阻塞主线程并同时处理这两个请求。相反,我在控制台中看到的是 Server Listening Start processing Processing took 3007ms Start processing Processing took 3005ms 而不是 Server Listening Start processing Start processing Processing took 3007ms Processing took 30

我同时从两个客户端访问
/users
端点。我希望它不会阻塞主线程并同时处理这两个请求。相反,我在控制台中看到的是

Server Listening
Start processing
Processing took 3007ms
Start processing
Processing took 3005ms
而不是

Server Listening
Start processing
Start processing
Processing took 3007ms
Processing took 3005ms

我在我的机器上运行了您的代码,并进行了类似的日志记录,但我对其进行了一些更改,如图所示:

router.get('/users', function *() {
    if (this.query.fast === '1'){
      this.body = ['User 3', 'User 4']
    }
    else{
      yield new Promise((resolve, reject) => {
          setTimeout(() => resolve(this.body = ['User 1', 'User 2']), 5000);
      });
    }

});
然后我做一个
GET
to
http://localhost:3000/users
哪个等待在setTimeout中,然后我立即执行
GET
to
http://localhost:3000/users?fast=1
并立即返回结果。只是为了证明没有阻塞

$node server.js
Server Listening
Start processing
Start processing
Processing took 6ms
Processing took 5005ms

不太清楚为什么日志会让线程看起来像被阻塞了一样,可能是一些缓冲,但我认为这只是误导。

在url的末尾添加一个查询字符串可以让它按预期工作。这使我认为如果Koa来自同一个实体,请求可能会从同一个IP地址中阻塞请求。


不过,这只是一种推测。

实际上,您可以保持代码不变,只需添加一个查询字符串。你会得到同样的结果。我认为Koa可能会检查同一个请求是否来自同一个IP,那么它只会阻止它直到上一个IP完成。有什么发现吗?