Каковы различия между управляемой событиями и потоковой системой сервера?

  • Node.js - это управляемый событиями ввод-вывод и это однопоточный сервер, который действует на обратные вызовы и никогда не блокирует основной поток.

    • Но как это удается для неблокирующего ввода-вывода?
    • если он легко справляется, почему ни одна из них не управляет потоком?
    • Не работает другие потоки (за одним потоком, управляемым событиями), как нить?
    • если другие потоки означают, что рабочие (за потоком, управляемым событиями) заняты, как он все еще может обрабатывать задания без блокировки?
  • Модель на основе темы, назначающая задачу потоку, и если нет пустой поток, блокировать новые задачи.

    • если поток может обрабатывать несколько задач, таких как одиночные события поток, который обрабатывает каждый ввод-вывод без блокировки, почему потоковые система не использует эту тактику для занятых потоков для ввода-вывода без блокировка.

Мне интересно, каковы различия (преимущества/недостатки) между управляемыми событиями и потоковыми серверными системами.

Ответ 1

Различие может быть описано следующим образом (с некоторым упрощением):

  • во время работы с потоком, когда приходит запрос, создается новый поток, и вся обработка выполняется в этом потоке.

  • во время выполнения событий, связанных с событиями, когда приходит запрос, событие отправляется, и обработчик его подбирает. Когда? В Node.js существует "цикл событий", который в основном зацикляет все фрагменты кода, которые необходимо выполнить, и выполняет их по очереди. Таким образом, обработчик обрабатывает событие, когда цикл события вызывает его. Важно то, что все обработчики вызываются в одном потоке - цикл событий не имеет пула потоков для использования, он имеет только один поток.

В "управляемой событием" модели, если обработчик займет очень много времени (т.е. с помощью цикла с интенсивным вычислением for внутри), никакой другой запрос не будет обработан в течение этого времени, поскольку цикл события не будет вызывать следующий обработчик до завершения текущего. Это обычно не проблема из-за асинхронного характера Javascript.

С другой стороны, в модели с "потоком", если обработчик занимает много времени для завершения, это не повредит другим потокам, потому что они могут работать в одно и то же время независимо.

К сожалению, создание нового потока добавляет некоторые накладные расходы, и если вам нужно обрабатывать тысячи одновременных подключений, это может стать бременем. Поэтому Node.js считается быстрым - независимо от того, сколько соединений вы обрабатываете, существует только один поток 1. Вам просто нужно быть немного осторожным, чтобы не блокировать ни одного из обработчиков, чтобы держать вещи в движении. К счастью, большую часть времени это не так просто писать блокирующий код JavaScript.

Также важно отметить, что запись асинхронного кода возможна в большинстве сеансов. Он стал наиболее широко использоваться в Node.js, хотя из-за характера Javascript. Благодаря этому практически каждая библиотека, которую вы используете в Node, будет асинхронной.

См. эту статью (и изображения) для объяснения цикла событий.

1 Конечно, есть еще один поток в процессе Node.js, некоторые из них связаны с I/O. Но ваша логика приложения обрабатывается в одном потоке.