2014-11-04 4 views
0

Я знаю, что этот вопрос обсуждался в прошлом в деталях (How is Node.js inherently faster when it still relies on Threads internally?), но я все еще не правильно понимаю модель цикла событий node.js и являюсь однопоточной моделью, как она обрабатывает одновременные запросы.Как модель цикла событий Node.js хорошо масштабируется

Uptil теперь мое понимание: мы получаем запрос IO -> поток создается внутренне узлом.js и запрос IO передается ему -> так как это запрос ввода-вывода, поэтому процессор передает его на контроллер DMA и освобождает этот поток -> этот поток снова входит в пул потоков для обслуживания другого запроса -> DMA все еще выполняет IO, после того, как DMA получит все данные в виде какого-либо события, - это событие захватывается систему node.js, и она помещает поставленную функцию обратного вызова в цикл событий -> всякий раз, когда цикл событий получает возможность выполнить обратный вызов данных, полученных с помощью IO ->, благодаря закрытию, функция обратного вызова выполняется на извлеченных данных только по обратному вызову

Так что этот процесс продолжается многократно. Пожалуйста, кто-то пролить свет на мое понимание и предоставить некоторую информацию

+0

Хорошо, вы четко понимаете, как работает eventloop, я не уверен, что мы можем сказать, что это сделает его * click * для вас. В то время как происходят события, такие как взаимодействие с базами данных, доступ к файлам и т. Д., Цикл событий продолжается, обрабатывая другие запросы, ожидая завершения указанных событий. Эти события происходят в отдельных потоках системы, а не в узле. –

+0

Может быть, ответ здесь поможет? http://stackoverflow.com/questions/22887216/how-does-a-single-threaded-event-driven-webserver-like-node-js-work-at-the-soc –

+0

Я действительно считаю, что мое общее понимание ясное ... но я ищу более тонкие детали ... когда я говорю «так как это запрос ввода-вывода, поэтому процессор передает его контроллеру DMA и освобождает этот поток -> этот поток снова входит в пул потоков для обслуживания другого запроса «это правильно и является ли причиной меньшего количества потребляемых потоков (следовательно, меньше использования памяти) в узле? В других системах, таких как java, если я кодирую одну и ту же логику, то передаю запрос IO в поток, тогда этот поток будет ждать, пока запрос не будет завершен? – JackSparrow

ответ

1

Существует только один поток (основной поток) для работы с сетью I/O (файловый ввод/вывод немного другая история, потому что не все платформы обеспечивают полезный асинхронный , неблокирующие API-интерфейсы ввода-вывода файлов, поэтому синхронные API-интерфейсы ввода-вывода файлов используются на этих платформах в поточном пуле).

Итак, когда поступают сетевые запросы, все они обрабатываются основной нитью, которая использует (косвенно через libuv) epoll/kqueue/IOCP/etc. для обнаружения (неблокирующим способом), когда доступны данные (или когда есть входящее TCP-соединение, например). Если имеются данные, они соответствующим образом вызывают javascript, передавая данные сокета. Если в сокете нет данных (и для цикла событий нет ничего другого, например, для таймеров запуска), то выполнение переходит к следующей итерации цикла событий, где процесс начинается снова и снова.

Что касается сопоставления данных сокетов с объектами javascript сокета, это комбинация объектов оболочки C++ (например, tcp_wrap, udp_wrap и т. Д.) И объектов javascript, которые гарантируют, что данные попадут в соответствующее место.

Вот несколько более старая диаграмма, поясняющая, что происходит в одном цикле цикла событий узла. Некоторые из них, возможно, немного изменились с узлом v0.9, но он получает вас общую идею:

enter image description here

+0

Откуда у вас эта фотография? – Bergi

+0

@Bergi Один из основных разработчиков в IRC опубликовал ссылку на него давно, еще до того, как был выпущен v0.10. – mscdex

0

node.js имеет единую поточную модель, которая устраняет необходимость в замки и семафоры (используется в традиционная многопоточная модель). Замки и семафоры могут добавить некоторые издержки с точки зрения производительности и, что более важно, могут обеспечить много веревки, чтобы повесить себя (другими словами, много подводных камней). Операции ввода-вывода выполняются параллельно, и поскольку работа между IO обычно очень мала, эта однопоточная модель обычно работает очень хорошо.

(примечание стороны: если у вас есть приложение, которое делает много работы между операциями ввода-вывода, т.е. CPU интенсивных приложений, то есть случай, когда узел не очень хорошо масштабируется)

Мне нравится думать, аргумент за то, что модель узла хорошо масштабируется, такова, что люди считают, что NoSQL масштабируется лучше, чем базы данных SQL. Очевидно, что Java (многопоточный) и шкала SQL; такие крупные компании, как Facebook и Twitter, доказали это. Однако, как и в SQL, есть много вещей, которые вы могли бы сделать неправильно, чтобы замедлить производительность. Node.js не устраняет все потенциальные проблемы, он просто помогает ограничить многие из общих причин.

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