¿Por qué nodejs es asincrónico y no bloqueante?
Muchas operaciones de E/S son esenciales durante la ejecución del programa, como leer y escribir archivos, entradas y salidas, solicitar respuestas, etc. Las operaciones de E/S son las que consumen más tiempo, al menos en relación con el código. En un modelo de programación tradicional, por ejemplo, si desea leer un archivo, todo el hilo se detendrá y esperará a que se lea el archivo antes de continuar. En otras palabras, las operaciones de E/S bloquean la ejecución del código y reducen en gran medida la eficiencia del programa.
El siguiente es un ejemplo de C# leyendo un archivo:
Cadena privada ReadTxtToStr (nombre de archivo de cadena)
{
/ / abrir archivo. Durante el período de apertura, otro código dejará de ejecutarse y la ejecución de este código continuará hasta que se complete la apertura.
FileStream fs = Archivo. open(nombre de archivo, modoarchivo.open);
Consola. WriteLine("Fui bloqueado por un archivo abierto.");
StreamReader sr = new StreamReader(fs);
//Leer el archivo, otro código durante el proceso de lectura Ejecución se detendrá y la ejecución del código continuará hasta que se complete la lectura.
cadena str = Sr . ReadToEnd();
Consola. WriteLine("No puedo leer el archivo.");
Cadena de retorno;
}
En el código anterior, dos consolas. WriteLine() se ejecutará, pero se bloquearán inocentemente por un tiempo. En teoría, si se necesitan 10 segundos para leer este archivo, entonces perderemos 10 segundos en espera de E/S (una gran parte del tiempo de ejecución real del programa se desperdicia en espera de E/S), que es un número astronómico a los ojos. de programadores.
Tener E/S asincrónicas es bueno porque la E/S es más costosa que la mayoría del código y deberíamos hacer algo mejor que simplemente esperar la E/S.
Entrada y salida sin bloqueo
Comprender las E/S con bloqueo y las E/S sin bloqueo es fácil de entender. E / S sin bloqueo significa que durante la ejecución del programa, la operación de E / S no bloqueará la ejecución del programa, es decir, la operación de E / S continuará ejecutando otro código (gracias al mecanismo de bucle de eventos de Node ). En una era en la que la eficiencia de los dispositivos de E/S es mucho menor que la de las CPU, la mejora del rendimiento aportada por este modo de E/S (E/S sin bloqueo) es muy considerable.
Bien, experimentemos cómo usar Node.js para lograr E/S sin bloqueo y continuar leyendo archivos y códigos:
var fs = require(" fs ");
fs.readFile("./testfile", "utf8", función (error, archivo) {
si (error) arroja un error;
Consola .log("¡He terminado de leer el documento!");
});
Console.log("¡No seré bloqueado!");
Copie el código anterior, guárdelo como test.js y cree un nuevo archivo llamado testfile en el mismo directorio. Utilice el comando node para ejecutar test.js y verá el siguiente resultado:
¡No seré bloqueado!
¡He terminado de leer el documento!
Esto obviamente no se ajusta al orden tradicional de ejecución del programa. Tenga en cuenta que esta es la E/S sin bloqueo de Node.js.
Primero explique el siguiente programa. Si está familiarizado con JavaScript, ignórelo.
var fs = require(" fs ");
El código anterior: presenta el módulo de sistema de archivos integrado Require() en Node.js, que es equivalente a la importación de Java. y C++ incluyen.
fs.readFile(".
/testfile "," utf8 ", función (error, archivo) {
si (error) arroja un error;
Console.log("¡He terminado de leer el archivo!" );
});
El código anterior: operación de E/S, vincula una función de devolución de llamada (error, archivo){} a readFile, ejecuta la devolución de llamada después de leer la función de archivo de prueba Al mismo tiempo, el siguiente código continúa ejecutándose y no será bloqueado por E/S.
Por eso veo "¡No seré bloqueado!". ” y luego vi “¡Terminé de leer el documento!” ""porque.
El bucle de eventos de Node.js
"Introducción a Node" recomienda que leamos la publicación del blog de Xu Mi sobre sondeo de eventos, que realmente vale la pena leer. Mi inglés es promedio y apenas puedo entenderlo con un diccionario, así que puedo entenderlo.
La frase más clásica que dijo Xu Mi:
¡Excepto por tu código, todo se ejecuta en paralelo!
(En Nodo) ¡Todo es paralelo excepto el código!
Comprenda esta oración y luego aprenda Node, ¡obtendrá el doble de resultado con la mitad de esfuerzo!