2015-03-23 12 views
10

Я сделал несколько поисков по вопросу, но кажется, что люди подчеркивают только неблокирующее IO.Как Node.js обрабатывает одновременные запросы одним потоком?

Предположим, если у меня просто очень простое приложение для ответа на текст «Hello World» для клиента, для завершения выполнения все равно потребуется время, независимо от того, насколько быстро оно выполняется. Что делать, если два запроса поступают в одно и то же время, как Node.js удостоверится, что оба запроса будут обработаны одним потоком?

Я прочитал блог Understanding the node.js event loop, в котором говорится: «Конечно, на сервере есть потоки и процессы для доступа к БД и выполнения процесса». Это утверждение относится к IO, но я также задаюсь вопросом, есть ли отдельный поток для обработки очереди запросов. Если это так, могу ли я сказать, что концепция единого потока Node.js применима только к разработчикам, которые создают приложения на Node.js, но Node.js на самом деле работает на многопоточных за сценой?

+0

Обратите внимание, что «В node.js, все работает параллельно кроме вашего кода ". Ваш код работает в одном потоке, но события обрабатываются несколькими потоками за сценой. –

+0

@BibekSubedi, я google 'В node.js, все работает параллельно, кроме вашего кода', это помогает прояснить некоторые путаницы, спасибо. –

ответ

8

Операционная система предоставляет каждому сокетному соединению очередь отправки и получения. Вот где байты сидят до тех пор, пока что-то на уровне приложения не обработает их. Если очередь приема заполняется, ни один подключенный клиент не может отправлять информацию до тех пор, пока в очереди не будет свободного места. Вот почему приложение должно обрабатывать запросы как можно быстрее.

Если вы находитесь в системе * nix, вы можете использовать netstat для просмотра текущего количества байтов в очередях отправки и получения. В этом примере в очереди приема есть 0 байтов и 240 байтов в очереди отправки (ожидающих отправки ОС).

Proto Recv-Q Send-Q Local Address    Foreign Address    State 
tcp  0  240 x.x.x.x:22     x.x.x.x:*     LISTEN 

В Linux вы можете проверить размер по умолчанию и максимально допустимый размер отправки/получения очереди с прок файловой системы:

Receive: 

cat /proc/sys/net/core/rmem_default 
cat /proc/sys/net/core/rmem_max 

Send: 

cat /proc/sys/net/core/wmem_max 
cat /proc/sys/net/core/wmem_default 
+0

Итак, вы говорите, что Node.js отвечает на ОС для очереди запросов, у нее нет собственной реализации для обработки очереди, правильно ли это? –

+0

Да, в Node.js нет ничего волшебного, как и все другие приложения, это зависит от ОС для обработки сетевого уровня. – Michael

+0

Я все еще смущен. Я просто прочитал «Это в отличие от сегодняшней более распространенной модели параллелизма, где используются потоки ОС» со страницы Node [about] (https://nodejs.org/about/). Похоже, что Nodejs не использует поток ОС, не уверен, что я правильно его понимаю. –

Смежные вопросы