【问题标题】:NodeJS Express Async Not Handling More Requests [duplicate]NodeJS Express异步不处理更多请求[重复]
【发布时间】:2021-08-01 03:25:31
【问题描述】:

完全披露:我是 nodeJS 初学者。

目的:使用 async-await 测试 NodeJS 同时快速处理多个请求,同时在 Promise 上被阻塞。

测试策略:使用 async get 创建一个简单的 nodeJS express 服务器。打开调用同一端口的两个浏览器选项卡。尽管是异步的,但两个浏览器请求都是按顺序处理的。

代码:

const express = require('express')

const app = express()

var i=0;

async function sleep(ms) {
    console.log("inside sleep now")
    return new Promise((resolve) => {
        setTimeout(resolve, ms)
    });
}


app.get('', async (req, res) => {
    i++
    console.log('Got new request. i count:' + i)
    console.log('Thread i:' + i + ' starting to sleep')
    await sleep(10000).then((resolve) => {
        console.log('I am resolved now')
        res.send('Hello Express')
    })
    console.log('Thread i:' + i + ' awake from sleep')

})

观察到的结果:尽管异步等待,但当我使用选项卡打开第二个浏览器时,直到第一个线程唤醒,我看不到第二个浏览器请求的请求日志。

问题: 我错过了什么?可以表示不同时处理两个浏览器请求,同时被承诺阻止,尽管 async-await。我一定是遗漏了一些东西,因为我知道 nodeJS 在单线程时可以通过优化等待时间来处理多个请求。

【问题讨论】:

标签: javascript node.js express asynchronous async-await


【解决方案1】:

您对async/await 的使用毫无意义。都可以去了。

  1. 在您的sleep() 函数中使用是不必要的,因为如果您不使用await,请不要将该函数声明为asyncasync/await 仅在成对使用时才有意义。
  2. 在您的app.get 处理程序中使用是不必要的,因为如果您已经在使用.then() 来等待一个promise,那么您就不需要在它上面加上await。如果您不使用 await,请参阅 #1。

去掉绒毛后,剩下的代码是这样的:

const express = require('express');
const app = express();

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

app.get('/', (req, res) => {
    sleep(10000).then(() => res.send('Hello Express'));
});

Promise 不会阻塞。他们注册一个回调,程序立即执行。

上面的代码可以很好地处理并发请求。 sleep().then() 所做的只是注册一个回调并继续前进。 10 秒后,超时,节点运行注册的回调() => res.send('Hello Express'),就这样。 任何时候都不会阻止。


您可以将上面的内容重写为

app.get('/', async (req, res) => {
    await sleep(10000);
    res.send('Hello Express');
});

什么都不会改变。

await 不会阻止。它注册一个回调(各种),程序执行立即继续。

从使用await 的函数内部看起来像阻塞。从外面看,它没有。程序执行永不停止。

awaitsleep(10000) 之后放置一个书签,并立即将控制权交还给节点的主事件循环。 10 秒后,超时命中,节点继续在书签位置执行函数,下一个运行 res.send('Hello Express')任何时候都不会阻止。

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2016-06-16
    • 2018-05-27
    • 2019-03-26
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多