Entonces, para responder a su primera y segunda pregunta:
Sin bloqueo es efectivamente lo mismo que asincrónico: haces la llamada y obtendrás un resultado más tarde, pero mientras eso sucede, puedes hacer otra cosa. El bloqueo es lo contrario. Espera a que vuelva la llamada antes de continuar su viaje.
Ahora el código asincrónico / sin bloqueo suena absolutamente fantástico, y lo es. Pero tengo palabras de advertencia. Async / Non-block son excelentes cuando se trabaja en entornos restringidos, como en un teléfono móvil ... considere CPU / memoria limitada. También es bueno para el desarrollo de front-end, donde su código necesita reaccionar a un widget de UI de alguna manera.
La asincronía es fundamental para la forma en que todos los sistemas operativos deben funcionar: hacen las cosas por ti en segundo plano y activan tu código cuando han hecho lo que pediste, y cuando esa llamada falla, te dicen que no. funcionan mediante una excepción o algún tipo de código de retorno / objeto de error.
En el momento en que su código solicita algo que tardará un tiempo en responder, su sistema operativo sabe que puede estar ocupado haciendo otras cosas. Su código: un proceso, subproceso o equivalente, bloques. Su código es totalmente ajeno a lo que está sucediendo en el sistema operativo mientras espera que se establezca la conexión de red, o mientras espera esa respuesta de una solicitud HTTP, o mientras espera esa lectura / escritura de un archivo, y pronto. Su código podría "simplemente" estar esperando un clic del mouse. Lo que realmente estaba sucediendo durante ese tiempo era que su sistema operativo administraba, programaba y reaccionaba sin problemas a los "eventos": cosas que el sistema operativo busca, como administrar la memoria, E / S (teclado, mouse, disco, Internet), otras tareas, recuperación de fallos, etc.
Los sistemas operativos son jodidamente duros. Son realmente buenos para ocultarle a usted, el programador, todas las cosas complicadas de async / non-block. Y así es como la mayoría de los programadores llegaron a donde estamos hoy con el software. Ahora que estamos alcanzando los límites de la CPU, la gente dice que se pueden hacer cosas en paralelo para mejorar el rendimiento. Esto significa que Async / non-block parece algo muy favorable, y sí, si su software lo exige, puedo estar de acuerdo.
Si está escribiendo un servidor web back-end, proceda con precaución. Recuerde que puede escalar horizontalmente por mucho más barato. Sin embargo, Netflix / Amazon / Google / Facebook son excepciones obvias a esta regla, simplemente porque les resulta más barato usar menos hardware.
Te diré por qué el código asíncrono / sin bloqueo es una pesadilla con los sistemas de back-end ...
1) Se convierte en una negación de servicio en productividad ... tienes que pensar MUCHO más, y cometes muchos errores en el camino.
2) Los rastros de pila en el código reactivo se vuelven indescifrables: es difícil saber qué se llama qué, cuándo, por qué y cómo. Buena suerte con la depuración.
3) Tienes que pensar más en cómo fallan las cosas, especialmente cuando muchas cosas vuelven a estar fuera de orden de cómo las enviaste. En el viejo mundo, hacías una cosa a la vez.
4) Es más difícil de probar.
5) Es más difícil de mantener.
6) Es doloroso. La programación debe ser divertida y divertida. Solo a los masoquistas les gusta el dolor. Las personas que escriben marcos concurrentes / reactivos son sádicos.
Y sí, he escrito tanto sync como async. Prefiero la sincronización, ya que 99,99 de las aplicaciones de back-end pueden funcionar con este paradigma. Las aplicaciones de front-end necesitan código reactivo, sin lugar a dudas, y siempre ha sido así.
Sí, el código puede ser asíncrono, sin bloqueo Y basado en eventos.
Lo más importante en la programación es asegurarse de que su código funcione y responda en un período de tiempo aceptable. Cíñete a ese principio clave y no te equivocarás.