Почему функция и неблокирующий обратный вызов в 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 является однопоточным, это все равно будет представлять проблему, если не будет какой-либо способ выполнения параллельной обработки .. Гарантирует ли функция / обратный вызов только неблокирующую работу, ЕСЛИ мы используем неблокирующие методы, такие как дочерние процессы и т. Д. .

11
задан Community 23 May 2017 в 11:48
поделиться