Javascript
имеет только один поток, представьте себе, что Java servlet container
работает с одним потоком. Единственное отличие состоит в том, что код JS
ожидает, что вы освободите поток, если вы не будете активно обрабатывать (активно используя циклы ЦП) что-либо, в то время как Java будет ожидать, что вы заблокируете поток, пока не будете готовы вернуть ответ, даже если вы ждете IO
(т.е. запрос БД)
Таким образом, когда мы говорим, что Nodejs
способен обслуживать множество запросов, мы имеем в виду множество IO bound
запросов, которые являются большинством реальных HTTP-запросов. Он не может выполнить любой многопоточный сервер с точки зрения обслуживания CPU bound
запросов, что является неправильным вариантом использования для nodejs
. В случае IO bound
узел запросов просто продолжит помещать запросы в очередь, как только они перейдут на IO
. Эти запросы имеют метод обратного вызова (для ответа ввода-вывода, т. Е. Вывода запроса БД), прикрепленный к ним для определенных событий, который проверяется во время цикла событий. Таким образом, во время выполнения цикла событий узел может иметь миллион запросов в очереди и не использовать ЦП ни для какого, если ни одно из событий еще не было запущено. Контейнер сервлета умрет, прежде чем обслужит 1 миллион запросов, потому что он не сможет идти в ногу с ресурсами, необходимыми миллиону потоков.
Теперь даже Servlet API
имеет async
возможности request.startAsync () , который освобождает поток контейнера при ожидании IO
или любого другого события, освобождая потоки для обслуживания большего количества запросов.