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
的请求也不会被序列化。
我想使用可以多线程或多进程请求的 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
的请求也不会被序列化。