Как узел обрабатывает многократный блокирующий запрос ввода-вывода, когда количество запросов превышает внутренний пул потоков - PullRequest
2 голосов
/ 24 апреля 2019

Итак, ниже мое понимание node.js. Пожалуйста, поправьте меня, если я что-то здесь упускаю.

  • Каждый входящий запрос будет сначала сохранен в очереди событий.

  • Цикл событий будет обслуживать запросы из очереди событий.

  • Неблокирующий запрос будет напрямую обслуживаться через цикл обработки событий без вызова потоков.

  • Запросы на блокировку отправят ответ в пул событий после завершения и в пул событий, который, в свою очередь, отправит запросы обратно клиентам.

Предположим, что внутренний пул потоков имеет размер x, и у нас нет y одновременных запросов, пытающихся получить доступ к нашему приложению. Все они блокируют ввод / вывод (y> x).

Таким образом, цикл обработки событий будет обрабатывать эти x количество запросов, потребляя x (которое также является общим числом потоков) количеством потоков, и, поскольку все x запросов блокируют ввод / вывод, давайте рассмотрим, что все находятся в состоянии обработки и ни один из них не был завершен.

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