Итак, ниже мое понимание node.js. Пожалуйста, поправьте меня, если я что-то здесь упускаю.
Каждый входящий запрос будет сначала сохранен в очереди событий.
Цикл событий будет обслуживать запросы из очереди событий.
Неблокирующий запрос будет напрямую обслуживаться через цикл обработки событий без вызова потоков.
Запросы на блокировку отправят ответ в пул событий после завершения и в пул событий, который, в свою очередь, отправит запросы обратно клиентам.
Предположим, что внутренний пул потоков имеет размер x, и у нас нет y одновременных запросов, пытающихся получить доступ к нашему приложению. Все они блокируют ввод / вывод (y> x).
Таким образом, цикл обработки событий будет обрабатывать эти x количество запросов, потребляя x (которое также является общим числом потоков) количеством потоков, и, поскольку все x запросов блокируют ввод / вывод, давайте рассмотрим, что все находятся в состоянии обработки и ни один из них не был завершен.
- Теперь, для остальных запросов, т. Е. (У-х), которые блокируют ввод / вывод,
Что с ними будет?
- Если они будут обслуживаться после выпуска некоторых потоков, то каковы преимущества использования узла по сравнению с многопоточностью, предоставляемой другими языками?
- Какой из них будет приоритезирован циклом событий, обслуживанием запросов из очереди событий или обслуживанием ответа от блокировки запроса ввода-вывода (см. Информацию выше 4)
- Если цикл обработки событий выбирает запросы один за другим из очереди событий и позволяет сказать, что каждый запрос занимает 10 секунд, и все они имеют неблокирующую природу, и у нас есть в общей сложности 20 таких запросов, которые помещаются в очередь в очереди событий, то в этом Если для выбора 20-го запроса потребуется цикл обработки событий 190 секунд (время завершения 19 запросов), аналогичным образом, для выбора 19-го запроса потребуется 180 секунд и так далее. Это займет слишком много времени, чего не должно быть. Как узел обрабатывает этот случай?