Python e Ruby também têm essa estrutura, mas como as bibliotecas que contêm código síncrono são inevitavelmente usadas no uso real, elas não cresceram. Antes do Node.js, a programação do lado do servidor do JavaScript estava quase em branco, então o Node.js conseguiu estabelecer uma biblioteca de código onde todo o IO era assíncrono.
Os gargalos da maioria dos aplicativos da Web estão em IO, a saber, ler e escrever discos, ler e escrever redes e ler e gravar bancos de dados. Que tipo de estratégia usar para aguardar esse período de tempo se tornou o ponto principal para melhorar o desempenho.
Estratégia do PHP: execute vários processos, aguarde a IO concluída diretamente. Desvantagens: Vários processos consomem múltiplas memória, dificultando o compartilhamento de dados entre os processos.
C/C ++ Strategy Common: Execute multi-threading e o programa mantém o próprio status de bloqueio. Desvantagens: alto custo de desenvolvimento, fáceis de cometer erros e difícil depurar.
Python (Tornado): Várias solicitações são executadas por sua vez em um único processo e mude para outra solicitação quando encontrar IO. Desvantagens: para uma única solicitação, o tempo ainda não é usado com mais eficiência.
O que é "o tempo de uso com mais eficiência"? Por exemplo, agora existem duas consultas de banco de dados não relacionadas. No PHP, geralmente será executado primeiro e o segundo será executado após a conclusão da execução (o tempo total é A + B). Obviamente, isso não é o mais eficiente. Duas consultas devem ser executadas ao mesmo tempo, e o tempo é máximo (a, b).
O problema com o Python e outros idiomas que suportam o multithreading é que, no nível do idioma, é difícil para os programadores dizer às máquinas virtuais que duas operações devem ser executadas simultaneamente. Mesmo se houver uma maneira, é bastante problemático. A maioria das pessoas tem preguiça de usar (não vale a pena usar). Como o Node.js força loucamente toda a execução de IO de forma assíncrona, os programadores Node.js também podem ser considerados familiarizados com ele. Em combinação com algumas bibliotecas para melhorar a legibilidade do código (promessa, assíncrona), ele pode facilmente permitir que operações irrelevantes sejam executadas em paralelo.
O acima fala sobre a implementação do IO assíncrono, então onde as vantagens do IO assíncrono refletem? De fato, o IO assíncrono não pode reduzir magicamente a pressão no servidor. Para adicionar um servidor, você ainda precisa adicionar um servidor, mas o IO assíncrono reduzirá o tempo de uma única solicitação e removerá o tempo de espera sem sentido em uma única solicitação. Portanto, as solicitações processadas dentro do tempo da unidade não foram alteradas, mas o tempo de processamento para cada solicitação foi reduzido. Nessa perspectiva, o servidor também salva alguns recursos - ou seja, mantém a memória consumida por cada conexão solicitada.