Это очень старый вопрос, но я предполагаю, что это может помочь кому-то другому понять программирование, управляемое событиями:
Эта следующая аналогия может помочь вам понять программирование событий ввода / вывода, проводя параллель с ожиданием.линия на рецепции врача.
Блокировка ввода / вывода похожа, если вы стоите в очереди, регистратор просит парня перед вами заполнить форму, и она ждет, пока он не закончит.Вы должны подождать своей очереди, пока парень не закончит свою форму, это блокирует.
Если одинокому парню требуется 3 минуты, чтобы заполнить, 10-му парню придется подождать до 30 минут.Теперь, чтобы сократить это время ожидания 10-го парня, решение будет заключаться в увеличении числа администраторов, что является дорогостоящим.Это то, что происходит на традиционных веб-серверах.Если вы запрашиваете информацию о пользователе, последующий запрос других пользователей должен дождаться завершения текущей операции, извлекаемой из базы данных.Это увеличивает «время до ответа» 10-го запроса и увеличивается экспоненциально для n-го пользователя.Чтобы избежать этого, традиционные веб-серверы создают поток (эквивалентный увеличению числа регистраторов) для каждого отдельного запроса, т. Е. В основном он создает копию сервера для каждого запроса, что является дорогостоящим интервалом потребления ЦП, поскольку для каждого запроса потребуются операционные системы.нить.Чтобы увеличить масштаб приложения, вам придется использовать много вычислительных мощностей в приложении.
Event Driven : Другой подход к увеличению «времени отклика» очереди заключается в переходе к событию.проездной подход, при котором парень в очереди будет сдан, попросит заполнить и вернуться по завершении.Следовательно, администратор всегда может принять запрос.Это именно то, что Javascript делает с самого начала.В браузере javascript будет реагировать на события щелчка пользователя, прокрутки, пролистывания или выборки из базы данных и так далее.Это возможно в javascript по своей сути, потому что javascript рассматривает функции как объекты первого класса, и они могут быть переданы в качестве параметров другим функциям (так называемые обратные вызовы) и могут быть вызваны при завершении конкретной задачи.Именно это и делает node.js на сервере.Вы можете найти больше информации о программировании, управляемом событиями и блокировке ввода-вывода, в контексте узла здесь