Python y Ruby también tienen ese marco, pero debido a que las bibliotecas que contienen código síncrono se usan inevitablemente en uso real, no crecieron. Antes de Node.js, la programación del lado del servidor de JavaScript estaba casi en blanco, por lo que Node.js pudo establecer una biblioteca de código donde todo IO era asíncrono.
Los cuellos de botella de la mayoría de las aplicaciones web están en IO, a saber, leer y escribir discos, leer y escribir redes, y leer y escribir bases de datos. Qué tipo de estrategia usar para esperar este período de tiempo se ha convertido en el punto clave para mejorar el rendimiento.
Estrategia de PHP: ejecute múltiples procesos, espere a que IO se complete directamente. Desventajas: múltiples procesos consumen memoria múltiple, lo que dificulta compartir datos entre procesos.
C/C ++ Estrategia común: ejecute múltiples subprocesos, y el programa mantiene el estado de bloqueo en sí. Desventajas: alto costo de desarrollo, errores fáciles de cometer y difíciles de depurar.
Python (tornado): múltiples solicitudes se ejecutan a su vez en un solo proceso y cambian a otra solicitud cuando me encuentro con IO. Desventajas: para una sola solicitud, el tiempo aún no se usa de manera más eficiente.
¿Cuál es el "tiempo de uso de manera más eficiente"? Por ejemplo, ahora hay dos consultas de bases de datos no relacionadas. En PHP, uno generalmente se ejecutará primero, y el segundo se ejecutará después de que se complete la ejecución (el tiempo total es A + B). Obviamente, este no es el más eficiente. Dos consultas deben ejecutarse al mismo tiempo, y el tiempo es máximo (A, B).
El problema con Python y otros idiomas que admiten múltiples lecturas es que a nivel de idioma, es difícil para los programadores decirle a las máquinas virtuales que dos operaciones deben ejecutarse simultáneamente. Incluso si hay una manera, es bastante problemático. La mayoría de las personas son demasiado vago para usar (no vale la pena usar). Debido a que Node.js Lrazly obliga a toda la ejecución de IO de manera asincrónica, los programadores de Node.js también se puede decir que están familiarizados con él. En combinación con algunas bibliotecas para mejorar la legibilidad del código (promesa, async), puede permitir fácilmente las operaciones irrelevantes se ejecutan en paralelo.
Lo anterior habla sobre la implementación de IO asíncrono, entonces, ¿dónde se reflejan las ventajas de la IO asíncrona? De hecho, el IO asíncrono no puede reducir mágicamente la presión sobre el servidor. Para agregar un servidor, aún necesita agregar un servidor, pero Asynchronous IO reducirá el tiempo de una sola solicitud y eliminará el tiempo de espera sin sentido en una sola solicitud. Por lo tanto, las solicitudes procesadas dentro del tiempo no han cambiado, pero el tiempo de procesamiento para cada solicitud se ha reducido. Desde esta perspectiva, el servidor también guarda algunos recursos, es decir, mantiene la memoria consumida por cada conexión solicitada.