Express中的并发

肖恩

我想使用可以建立多线程或多进程请求的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}!`))

编辑:请求->响应

TJ人群

如果我快速调用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章