Почему функция и обратный вызов не блокируются в Node.JS?

Новичок понимает Node, что если я перезаписываю синхронный или встроенный код для использования функций / обратных вызовов, я могу гарантировать, что мой код не блокируется. Мне любопытно, как это работает с точки зрения стека событий. Простой пример отсюда:Не понимаю обратного вызова - Stackoverflow что это будет блокировать:

var post = db.query("select * from posts where id = 1");
doSomethingWithPost(post)
doSomethingElse();

Хотя это не будет:

callback = function(post){
doSomethingWithPost(post)
}

db.query("select * from posts where id = 1",callback);
doSomethingElse();

Хорошо, я понимаю, что мы должны использовать обратные вызовы. Но с точки зрения стека событий, почему это работает? Javascript является однопоточным. В первой строке примера используется дорогостоящая и блокирующая операция ввода-вывода. Строка 2 не может быть выполнена, пока не закончится первая строка. Это потому, что для строки 2 требуется информация из строки 1? Или это потому, что события ввода / вывода просто блокируют операции, а это означает, что они захватывают контроль и не возвращают его до завершения ...

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

Если второй запрос попадет в пример один, он не сможет обработать, пока запрос 1 не будет выполнен из-за операции блокировки ... но в примере два ... перемещение операций в функции автоматически порождает дочерние процессы или действует как многопоточный ? Если бы Javscript был однопоточным, это все равно представляло бы проблему, если бы не было какого-либо способа параллельной обработки. Гарантирует ли функция / обратный вызов только то, что она неблокирующая, ЕСЛИ мы используем неблокирующие методы, такие как дочерние процессы и т. Д. ,

Ответы на вопрос(4)

Ваш ответ на вопрос