Механизм обратного вызова Nodejs - какой поток обрабатывает обратный вызов?
Я новичок в nodeJS и интересовался моделью Node для одного экземпляра. В простом приложении nodeJs, когда некоторая блокирующая операция обрабатывается асинхронно с обратными вызовами, обрабатывает ли главный поток, выполняющий nodeJ, также обратный вызов?. Если запрос состоит в том, чтобы получить некоторые данные из базы данных, и есть сотни одновременно работающих пользователей, и каждая операция с базой данных занимает пару секунд, когда обратный вызов, наконец, запускается (для каждого из соединений), является основным потоком, принимающим эти запросы используется для выполнения обратного вызова, а? Если так, то как масштабируется nodeJs и как он реагирует так быстро?
1 ответ
Каждый экземпляр nodejs выполняется в одном потоке. Период. Когда вы делаете асинхронный вызов, скажем, сетевого запроса, он не ждет его, ни в вашем коде, ни где-либо еще. У него есть цикл обработки событий. Когда ответ готов, он вызывает ваш обратный вызов.
Это может быть невероятно быстрым, потому что для этого не нужно много потоков и все накладные расходы памяти, но это означает, что вы должны быть осторожны, чтобы не выполнять синхронную блокировку.
Существует довольно приличное объяснение цикла событий на http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ и оригинальной презентации jsconf Райана Даля http://www.youtube.com/watch?v=ztspvPYybIY стоит посмотреть. Вы когда-нибудь видели, чтобы инженер получил овации для технической презентации?