Будет ли блокировка происходить при доступе к асинхронным роутам?

Как работает цикл событий при выполнении роутов? Если приходит ответ из БД через 2 секунды, и в это время поступают другие запросы, добавляются ли они в цикл событий как новые колбеки для роутера или ждут окончания общего роута?

Пример общего роута, который выполняет запрос к БД и отправляет результаты клиенту:

```javascript
router.get('/', async function(req: Request, res: Response) {
    const pool = new Pool(config)
    const result = await pool.query('SELECT * from users')
    res.send(result.rows)
});
```
  • 6 октября 2023 г. 14:07
Ответы на вопрос 2
Блокировка не будет происходить при доступе к асинхронным роутам. В Node.js цикл событий позволяет обрабатывать асинхронные операции без блокировки других запросов. 

При выполнении роутов в цикле событий, если приходит ответ из БД через 2 секунды, он будет добавлен в очередь событий и обработается как новое событие. В это же время другие запросы также будут добавлены в очередь и будут обработаны после завершения предыдущих событий.

Таким образом, другие запросы будут добавлены в цикл событий как новые колбеки для роутера и будут обработаны после окончания текущего роута. Не будет ожидания окончания общего роута для обработки других запросов.
Функция async выполняется синхронно до первого await. Каждый await прерывает выполнение функции и возвращает управление в вызывающую функцию. Если это первый await, то выполнение продолжается в вызывающей функции, но там тоже может быть await (но может и не быть). Поэтому постепенно выполнение переходит в event-loop. После await выполнение продолжается непосредственно в event-loop, поэтому стек вызовов будет содержать только его. Когда выполнение находится в event-loop, он просто берет следующую задачу из очереди. Аsync function - это абстракция над промисами и их колбэками, которые выполняются в очереди микротасок, которую event-loop обрабатывает, пока она не станет пустой. 

В примере с вопросом:
1. Event-loop вызывает колбэк http сервера, который включает роутер.
2. Роутер вызывает наш колбэк, который может выполняться как синхронно, так и асинхронно (например, express выполняет синхронно).
3. Наш колбэк отправляет запрос в базу данных, получает промис и останавливается на await.
4. Управление возвращается роутеру, а он возвращает его в модуль http, в итоге все возвращается в event-loop.
5. Event-loop берет следующую задачу из очереди, которой может быть запрос к http серверу или ответ от базы данных.
Похожие вопросы