Ответ 1
Различие может быть описано следующим образом (с некоторым упрощением):
-
во время работы с потоком, когда приходит запрос, создается новый поток, и вся обработка выполняется в этом потоке.
-
во время выполнения событий, связанных с событиями, когда приходит запрос, событие отправляется, и обработчик его подбирает. Когда? В Node.js существует "цикл событий", который в основном зацикляет все фрагменты кода, которые необходимо выполнить, и выполняет их по очереди. Таким образом, обработчик обрабатывает событие, когда цикл события вызывает его. Важно то, что все обработчики вызываются в одном потоке - цикл событий не имеет пула потоков для использования, он имеет только один поток.
В "управляемой событием" модели, если обработчик займет очень много времени (т.е. с помощью цикла с интенсивным вычислением for
внутри), никакой другой запрос не будет обработан в течение этого времени, поскольку цикл события не будет вызывать следующий обработчик до завершения текущего. Это обычно не проблема из-за асинхронного характера Javascript.
С другой стороны, в модели с "потоком", если обработчик занимает много времени для завершения, это не повредит другим потокам, потому что они могут работать в одно и то же время независимо.
К сожалению, создание нового потока добавляет некоторые накладные расходы, и если вам нужно обрабатывать тысячи одновременных подключений, это может стать бременем. Поэтому Node.js считается быстрым - независимо от того, сколько соединений вы обрабатываете, существует только один поток 1. Вам просто нужно быть немного осторожным, чтобы не блокировать ни одного из обработчиков, чтобы держать вещи в движении. К счастью, большую часть времени это не так просто писать блокирующий код JavaScript.
Также важно отметить, что запись асинхронного кода возможна в большинстве сеансов. Он стал наиболее широко использоваться в Node.js, хотя из-за характера Javascript. Благодаря этому практически каждая библиотека, которую вы используете в Node, будет асинхронной.
См. эту статью (и изображения) для объяснения цикла событий.
1 Конечно, есть еще один поток в процессе Node.js, некоторые из них связаны с I/O. Но ваша логика приложения обрабатывается в одном потоке.