Параллелизм в экспрессе - PullRequest
       37

Параллелизм в экспрессе

2 голосов
/ 25 сентября 2019

Я хотел бы настроить 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}!`))

Редактировать: запрос -> ответ

1 Ответ

3 голосов
/ 25 сентября 2019

Если я вызову его быстро 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 не сериализуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...