Eu tenho aprendido e usando o Node.js há dois meses. Eu usei o Express e combinei com o Mongoose para escrever um aplicativo da Web e um conjunto de APIs da Web RESTful. Olhando para a introdução do Node.js na página inicial do site oficial do Node.js: Node.js usa um modelo de E/S sem bloqueio acionado por eventos que o torna leve e eficiente. Então, o que significa modelo de E/S não bloqueando?
Modelo IO não bloqueador
Primeiro de tudo, as operações de IO são sem dúvida demoradas. Quando o servidor recebe um grande número de solicitações, a criação de um processo ou encadeamento para cada solicitação também adiciona sobrecarga adicional de memória e pode perder mais tempo e recursos.
Como o Node.js é orientado a eventos, ele usa loops de eventos para resolver os problemas de gargalo causados pelas operações de IO. No Node.js, uma operação de IO geralmente tem uma função de retorno de chamada. Quando a operação de IO é concluída e retorna, a função de retorno de chamada será chamada e o thread principal continua a executar o código a seguir. Vamos ilustrar brevemente esse problema com um exemplo:
request ('http://www.google.com', function (erro, resposta, corpo) {console.log (body);}); console.log ('feito!');Este código significa emitir uma solicitação para 'http://www.google.com' e, quando a solicitação retorna essa função de retorno de chamada, as informações de resposta são emitidas. Devido ao mecanismo de corrida do Node.js, após a execução deste código, ele será lançado imediatamente 'feito!' no console e, em seguida, produza as informações de resposta após um período de tempo.
Loop de evento de eventos loop
Em seguida, vamos discutir o mecanismo de loop de eventos. Primeiro, vamos falar sobre a chamada, por exemplo, há o seguinte código:
função a (arg, func) {var a = arg; func (); console.log ('a'); } função b () {console.log ('b');} a (0, b);Depois que o código é executado, a função A é primeiro empurrada para a chamada e se torna o elemento superior da pilha e começa a executar A. Durante o processo de execução, a função B é empurrada para a chamada e se torna o elemento superior da pilha. Depois que B é executado, B é aparado e chamado, e A se torna o elemento superior da pilha novamente. Depois que A é executado, A é aparado e chamado, e a chamada está ociosa.
Há uma fila de mensagens no tempo de execução do JavaScript, e a mensagem está associada a uma função de retorno de chamada. Quando um evento for acionado, se o evento tiver uma função de retorno de chamada correspondente, a mensagem será adicionada à fila de mensagens.
Vamos falar sobre qual é o loop do evento. Depois que o código começa a executar, a função é constantemente empurrada para a chamada. Veja o exemplo acima. A solicitação é pressionada para a chamada e essa função fará uma solicitação HTTP (esta solicitação HTTP será entregue ao módulo subjacente do Node.js) e o evento concluído ao mesmo tempo está associado a uma função de retorno de chamada. A solicitação é exibida e ligada, e o console.log é empurrado para a chamada para iniciar a execução. Quando a solicitação é concluída, o evento de conclusão é acionado e uma mensagem é adicionada à fila de mensagens. A fila de mensagens primeiro verifica se a chamada está ociosa. Se a chamada não estiver ociosa, ele esperará até que a chamada esteja ociosa e apareça a cabeça da fila de mensagens. No momento, a função de retorno de chamada associada à mensagem é executada.
resumo
O exposto acima é um resumo conceitual do modelo não bloqueador e do loop de eventos. O mecanismo deste loop de evento não é apenas exclusivo do Node.js, e o código do Node.js é executado por um único thread. Quais são as vantagens ao enfrentar um grande número de solicitações simultâneas?
A figura acima mostra o diagrama de arquitetura do Node.JS. Existe um módulo na camada subjacente do Node.js é responsável por manter o pool de threads. Quando uma solicitação de IO é emitida, a camada subjacente do Node.js criará um novo thread para processar a solicitação e retornará o resultado à camada superior após a conclusão. Então, quando houver várias solicitações, o módulo subjacente do Node.js usará o menor número possível de threads para concluir a maioria das tarefas. Se houver tópicos gratuitos, continuará sendo usado para fazer outras coisas. Isso é sem dúvida muito mais inteligente e mais eficiente para a abertura de um novo processo ou thread para cada solicitação, conforme mencionado anteriormente.
Este artigo é um resumo do aprendizado do Node.JS. Se houver algum problema ou deficiências, críticas e correção são bem -vindas.