Por que uma função e um retorno de chamada não são bloqueadores no Node.JS?

O entendimento iniciante do Node é que, se eu reescrever código síncrono ou em linha, para utilizar funções / retornos de chamada, posso garantir que meu código não seja bloqueado. Estou curioso para saber como isso funciona em termos da pilha de eventos. O exemplo simples daqui: Não entendo o retorno de chamada - Stackoverflow é que isso bloqueará:

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

Enquanto isso não vai:

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

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

Ok, entendo que devemos usar retornos de chamada. Mas em termos da pilha de eventos, por que isso funciona? O Javascript é de thread único. No primeiro exemplo, a linha um utiliza uma operação de E / S cara e bloqueadora. A linha 2 não pode ser executada até que a linha um esteja concluída. Isso ocorre porque a linha 2 requer informações da linha 1? Ou é porque os eventos de E / S são apenas fundamentalmente operações de bloqueio, o que significa que eles assumem o controle e não o devolvem até que sejam concluídos ...

No segundo exemplo, a E / S cara foi movida para uma função e agora temos uma função de retorno de chamada. Certamente, o retorno de chamada não pode ser executado até que a E / S seja concluída. Isso não mudaria. Portanto, a diferença na quantidade de tempo que leva para executar entre um e dois deve ser principalmente o que aconteceria se uma segunda solicitação atingisse o servido

Se um segundo pedido atingir o exemplo um, ele não poderá processar até que o pedido 1 seja feito devido à operação de bloqueio .. mas no exemplo dois .. a movimentação de operações para funções gera automaticamente processos filho ou atua como múltiplos rosca? Se o Javscript tiver um único encadeamento, isso ainda representaria um problema, a menos que houvesse uma maneira de executar o processamento paralelo. Uma função / retorno de chamada garante apenas a não-bloqueio, se utilizarmos técnicas sem bloqueio, como processos filhos, etc. .

questionAnswers(8)

yourAnswerToTheQuestion