Express 中的并发

Concurrency in Express

我想使用可以多线程或多进程请求的 express 设置 API。 例如,下面是一个 api,它在发送响应之前休眠 5 秒。如果我快速调用3次,第一次响应需要5秒,第二次需要10秒,第三次需要15秒,说明请求是顺序处理的。

如何构建可以同时处理请求的应用程序。

const express = require('express')
const app = express()
const port = 4000

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

app.get('/', (req, res) => {
    sleep(5000).then(()=>{
        res.send('Hello World!')
    })

})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

编辑:请求 -> 响应

If I call it quickly 3 times, the first response will take 5 seconds, the second will take 10, and the third will take 15, indicating the requests were handled sequentially.

那只是因为您的浏览器正在序列化请求,因为它们都在请求相同的资源。在 Node.js/Express 端,这些请求是相互独立的。如果它们是从三个不同的客户端一个接一个地发送的,它们将在大约五秒后(而不是在 5、10 和 15 秒之后)分别得到响应。

例如,我更新了您的代码以输出响应的 date/time:

res.send('Hello World! ' + new Date().toISOString())

...然后尽可能快地在三个不同的浏览器中打开 http://localhost:4000 (我似乎没那么快 :-)) .回复时间为:

16:15:58.819Z
16:16:00.361Z
16:16:01.164Z

如您所见,它们相隔不到五秒。

但是如果我在同一个浏览器中分三个 windows 这样做,它们就会被序列化:

16:17:13.933Z
16:17:18.938Z
16:17:23.942Z

如果我进一步更新您的代码,使其处理三个不同的端点:

function handler(req, res) {
    sleep(5000).then(()=>{
        res.send('Hello World! ' + new Date().toISOString())
    })
}

app.get('/a', handler);
app.get('/b', handler);
app.get('/c', handler);

然后即使在同一个浏览器上,对/a/b/c的请求也不会被序列化。