¿Una llamada asincrónica siempre crea un nuevo hilo? ¿Cuál es la diferencia entre los dos?
¿Una llamada asincrónica siempre crea o usa un nuevo hilo?
En la programación de computadoras, los eventos asíncronos son aquellos que ocurren independientemente del flujo principal del programa. Las acciones asincrónicas son acciones ejecutadas en un esquema sin bloqueo, lo que permite que el flujo del programa principal continúe procesándose.
¿Sé que las llamadas asincrónicas se pueden hacer en subprocesos individuales? ¿Cómo es esto posible?
multithreading
language-agnostic
asynchronous
Ted Smith
fuente
fuente
Respuestas:
Esta pregunta es demasiado general para responderla.
En el caso general, una llamada asincrónica no necesariamente crea un nuevo hilo. Esa es una forma de implementarlo, con un grupo de subprocesos preexistente o un proceso externo siendo otras formas. Depende en gran medida del idioma, el modelo de objetos (si corresponde) y el entorno de tiempo de ejecución.
Asincrónico solo significa que el hilo de llamada no se sienta y espera la respuesta, ni la actividad asincrónica ocurre en el hilo de llamada.
Más allá de eso, necesitarás ser más específico.
fuente
Siempre que la operación que deba realizarse de forma asincrónica no requiera que la CPU haga el trabajo, esa operación se puede realizar sin generar otro subproceso. Por ejemplo, si la operación asíncrona es E / S, la CPU no tiene que esperar a que se complete la E / S. Solo necesita comenzar la operación, y luego puede pasar a otro trabajo mientras el hardware de E / S (controlador de disco, interfaz de red, etc.) realiza el trabajo de E / S. El hardware le avisa a la CPU cuando finaliza interrumpiendo la CPU, y luego el SO entrega el evento a su aplicación.
Con frecuencia, las abstracciones de nivel superior y las API no exponen las API asincrónicas subyacentes disponibles en el sistema operativo y el hardware subyacente. En esos casos, generalmente es más fácil crear subprocesos para realizar operaciones asincrónicas, incluso si el subproceso generado solo espera una operación de E / S.
Si la operación asincrónica requiere que la CPU trabaje, entonces esa operación generalmente tiene que ocurrir en otro hilo para que sea realmente asincrónica. Incluso entonces, en realidad solo será asíncrono si hay más de una unidad de ejecución.
fuente
No, las llamadas asincrónicas no siempre implican subprocesos.
Por lo general, inician algún tipo de operación que continúa en paralelo con la persona que llama. Pero esa operación podría ser manejada por otro proceso, por el sistema operativo, por otro hardware (como un controlador de disco), por alguna otra computadora en la red o por un ser humano. Los hilos no son la única forma de hacer las cosas en paralelo.
fuente
JavaScript es de un solo subproceso y asíncrono. Cuando utiliza XmlHttpRequest, por ejemplo, le proporciona una función de devolución de llamada que se ejecutará de forma asincrónica cuando regrese la respuesta.
John Resig tiene una buena explicación del problema relacionado de cómo funcionan los temporizadores en JavaScript .
fuente
El subprocesamiento múltiple se refiere a más de una operación que ocurre en el mismo proceso. Mientras que la programación asincrónica se extiende a través de los procesos. Por ejemplo, si mis operaciones llaman a un servicio web, el hilo no necesita esperar hasta que el servicio web regrese. Aquí usamos programación asíncrona que permite que el hilo no espere a que se complete un proceso en otra máquina. Y cuando comienza a recibir respuesta del servicio web, puede interrumpir el hilo principal para decir que el servicio web ha completado el procesamiento de la solicitud. Ahora el hilo principal puede procesar el resultado.
fuente
Windows siempre tuvo un procesamiento asincrónico desde los tiempos no preventivos (versiones 2.13, 3.0, 3.1, etc.) utilizando el bucle de mensajes, mucho antes de admitir hilos reales. Entonces, para responder a su pregunta, no, no es necesario crear un hilo para realizar el procesamiento asincrónico.
fuente
Las llamadas asincrónicas ni siquiera necesitan ocurrir en el mismo sistema / dispositivo que el que invoca la llamada. Entonces, si la pregunta es, ¿una llamada asincrónica requiere un hilo en el proceso actual, la respuesta es no. Sin embargo, debe haber un hilo de ejecución en algún lugar que procese la solicitud asincrónica.
Hilo de ejecución es un término vago. En sistemas de tareas cooperativas como los primeros sistemas operativos Macintosh y Windows, el hilo de ejecución podría ser simplemente el mismo proceso que hizo que la solicitud ejecutara otra pila, puntero de instrucción, etc. Sin embargo, cuando la gente generalmente habla de llamadas asincrónicas , generalmente se refieren a llamadas manejadas por otro subproceso si es dentro del proceso (es decir, dentro del mismo proceso) o por otro proceso si es entre procesos.
Tenga en cuenta que la comunicación entre procesos (o entre procesos) (IPC) se suele generalizar para incluir la comunicación dentro del proceso, ya que las técnicas para bloquear y sincronizar los datos suelen ser las mismas independientemente del proceso en el que se ejecutan los hilos de ejecución separados.
fuente
Algunos sistemas le permiten aprovechar la concurrencia en el núcleo para algunas instalaciones que utilizan devoluciones de llamada. Para una instancia bastante oscura, se utilizaron devoluciones de llamadas de E / S asincrónicas para implementar servidores de Internet sin bloqueo en los días de multitarea sin preferencia del sistema Mac 6-8.
De esta manera, tiene secuencias de ejecución concurrentes "en" su programa sin hilos como tales .
fuente
Asincrónico solo significa que no bloquea su programa esperando que algo (llamada de función, dispositivo, etc.) termine. Se puede implementar en un subproceso separado, pero también es común usar un subproceso dedicado para tareas síncronas y comunicarse a través de algún tipo de sistema de eventos y así lograr un comportamiento asíncrono.
Hay ejemplos de programas asincrónicos de subproceso único. Algo como:
fuente
La naturaleza de las llamadas asincrónicas es tal que, si desea que la aplicación continúe ejecutándose mientras la llamada está en progreso, deberá generar un nuevo hilo o al menos utilizar otro hilo que haya creado únicamente con el propósito de manejo de devoluciones de llamada asincrónicas.
A veces, dependiendo de la situación, es posible que desee invocar un método asincrónico pero hacer que parezca que el usuario es sincrónico (es decir, bloquear hasta que el método asincrónico haya indicado que está completo). Esto se puede lograr a través de las API de Win32, como WaitForSingleObject .
fuente