我想使用可以建立多线程或多进程请求的express来设置API。例如,下面是一个在发送响应之前休眠5秒钟的api。如果我快速调用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}!`))
编辑:请求->响应
如果我快速调用3次,则第一个响应将花费5秒,第二个响应将花费10秒,第三个响应将花费15秒,表明请求是按顺序处理的。
那仅仅是因为您的浏览器正在序列化请求,因为它们都在请求相同的资源。在Node.js / Express方面,这些请求彼此独立。如果它们是从三个单独的客户端一个接一个地发送的,则它们各自将在大约五秒钟后得到响应(而不是在5、10和15秒之后)。
例如,我更新了您的代码以输出响应的日期/时间:
res.send('Hello World! ' + new Date().toISOString())
...然后http://localhost:4000
尽可能快地在三个单独的浏览器中打开(我似乎不太快:-))。答复的时间是:
16:15:58.819Z 16:16:00.361Z 16:16:01.164Z
如您所见,它们之间相隔五秒钟。
但是,如果我在同一浏览器的三个窗口中执行此操作,它们将被序列化:
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
不序列化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句