¿Qué determina qué funciones de Javascript están bloqueando vs no bloqueando?


27

He estado haciendo Javascript basado en la web (JS de vainilla, jQuery, Backbone, etc.) durante algunos años, y recientemente he estado trabajando con Node.js. Me tomó un tiempo acostumbrarme a la programación "sin bloqueo", pero ahora me he acostumbrado a usar devoluciones de llamada para operaciones de E / S y demás.

Entiendo que Javascript es de un solo subproceso por naturaleza. Entiendo el concepto de Nodo "cola de eventos". Lo que NO entiendo es lo que determina si una operación individual de JavaScript está "bloqueando" frente a "no bloqueando". ¿Cómo sé en qué operaciones puedo depender para producir una salida sincrónicamente para usar en el código posterior, y a cuáles tendré que pasar las devoluciones de llamada para poder procesar la salida después de que se complete la operación inicial? ¿Existe una lista de funciones de Javascript en algún lugar que sean asíncronas / sin bloqueo, y una lista de las que son sincrónicas / bloqueantes? ¿Qué impide que mi aplicación Javascript sea una condición de carrera gigante?

Sé que las operaciones que toman mucho tiempo, como las operaciones IO en las operaciones Node y AJAX en la web, requieren que sean asíncronas y, por lo tanto, usan devoluciones de llamada, pero ¿quién determina qué califica como "mucho tiempo"? ¿Hay algún tipo de disparador dentro de estas operaciones que los elimine de la "cola de eventos" normal? Si no es así, ¿qué los hace diferentes de las operaciones simples como asignar valores a variables o recorrer las matrices, de lo que parece que podemos depender para terminar de manera síncrona?

Quizás ni siquiera estoy pensando en esto correctamente, esperando que alguien pueda aclararme. ¡Gracias!


Esto es algo que encontré que es realmente útil, aunque su respuesta a su pregunta es que debe verificar la documentación para averiguar si los métodos son asíncronos.
Anastasios Andronidis

Respuestas:


13

En general, cualquier función que trabaje en red o use temporizadores para hacer cosas durante un período de tiempo será asíncrona.

Si la función recibe una devolución de llamada, puede ver para qué se utiliza la devolución de llamada y, por lo general, será obvio si es asíncrono o no. Si la función no ofrece una devolución de llamada, entonces no tiene forma de comunicar resultados asincrónicos, por lo que probablemente no sea asincrónica.

No hay forma segura de asegurarlo. Tiene que especificarse en el documento para una función u obvio por la forma en que funciona la interfaz.

Las operaciones asincrónicas son diferentes bajo las cubiertas que las operaciones sincrónicas en que las operaciones asincrónicas tienen la noción de configurar una operación, comenzar la operación y luego recibir una notificación más tarde del progreso, finalización o errores en la operación. Iterar una matriz es una operación síncrona. No tiene ninguno de estos problemas. El código solo se ejecuta sincrónicamente. La emisión de una llamada ajax consiste en registrar una devolución de llamada para notificaciones de estado, luego iniciar la llamada ajax, luego continuar ejecutando otro javascript y luego, un tiempo después, la devolución de llamada se llama con un cambio de estado en la llamada ajax (como la finalización).


1
Como nota adicional, algunas funciones de Javascript son bloqueantes y no bloqueantes, dependiendo de sus parámetros. Por ejemplo, XMLHttpRequest.opentiene un asyncparámetro booleano que controla si la última llamada a sendes asíncrona.
Brian

Simplemente no encontré esta respuesta útil y en general explicada.
Mehdi Raash

@MehdiRaash: la respuesta es que lo averigua desde la documentación o desde la interfaz. No hay otra manera. Eso es lo que dice esto. No estoy seguro de qué más estabas esperando. No hay una respuesta mágica.
jfriend00

6

Por lo que entiendo que no estás preguntando por lo que se debe hacer asíncrono, pero cómo saber si una función es asíncrona.

Revisas la documentación. En serio, para eso está. No adivina lo que hace una función en función de su nombre o contexto simplemente así. Si no está seguro y tiene acceso a su código fuente, verifíquelo.

Esa es la única forma completamente confiable.

Ahora para adivinar.

  • Si acepta una devolución de llamada o devuelve una promesa, es probable que sea asíncrona (he visto excepciones para esa regla)
  • En general, todo lo relacionado con E / S en node.js y, más generalmente, en JavaScript se realiza de forma asincrónica (también he visto excepciones a esa regla)

4

Como JavaScript tiene un solo subproceso, todos los bloques de procesamiento hasta que se produce uno de los siguientes

1) La ejecución actual solicita un servicio externo, como una solicitud de E / S o de red, o una solicitud de trabajador web

2) Una llamada de función se pone en un temporizador para ejecutarse en un momento posterior

No hay una lista de funciones de bloqueo / no bloqueo. Debes consultar la documentación.

Su aplicación puede encontrar una condición de carrera si varios servicios externos tienen un bloqueo en el hilo de JavaScript e intentan acceder a él al mismo tiempo. Los navegadores modernos y el motor V8 manejan esto, pero puedes encontrar esta condición de carrera si usas phonegap y escribes aplicaciones javascript para dispositivos móviles. El soporte no está ahí para manejar estas condiciones de carrera.

En general, suponga que el código se bloquea a menos que haya una devolución de llamada. E incluso si hay una devolución de llamada, eso no significa que no se bloqueará.


-1

Yo también soy nuevo en node.js (y JavaScript en general) y no estoy acostumbrado a tanto código asincrónico. Solo quería señalar que en la Descripción general del bloqueo frente al no bloqueo en nodejs.org dice que:

Todos los métodos de E / S en la biblioteca estándar Node.js proporcionan versiones asincrónicas, que no bloquean, y aceptan funciones de devolución de llamada. Algunos métodos también tienen contrapartes de bloqueo, que tienen nombres que terminan con Sync.


1
¿Cómo aborda esto la pregunta que se hace? Vea cómo responder
mosquito
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.