Asíncrono vs Multithreading-¿Hay alguna diferencia?
language-agnostic asynchronous (11)
¿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 asincrónicos son aquellos que ocurren independientemente del flujo principal del programa. Las acciones asincrónicas son acciones ejecutadas en un esquema no bloqueante, lo que permite que el flujo del programa principal continúe el procesamiento.
Sé que las llamadas asíncronas se pueden hacer en subprocesos individuales. ¿Cómo es esto posible?
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 usaron devoluciones de llamada de I / O asíncronas para implementar servidores de Internet no bloqueantes en los días de multitareas sin preemptive de Mac System 6-8.
De esta forma, tiene secuencias de ejecución simultáneas "en" programa sin hilos como tales .
Asíncrono solo significa que no bloquea su programa esperando algo (llamada de función, dispositivo, etc.) para finalizar. Se puede implementar en un subproceso separado, pero también es común usar un subproceso dedicado para tareas sincrónicas y comunicarse a través de algún tipo de sistema de eventos y así lograr un comportamiento asincrónico.
Hay ejemplos de programas asincrónicos de subproceso único. Algo como:
...do something
...send some async request
while (not done)
...do something else
...do async check for results
Esta pregunta es casi demasiado general para responder.
En el caso general, una llamada asincrónica no crea necesariamente un nuevo hilo. Esa es una forma de implementarlo, con un grupo de subprocesos preexistente o un proceso externo de otras maneras. Depende en gran medida del idioma, el modelo de objeto (si lo hay) y el entorno de tiempo de ejecución.
Asíncrono solo significa que el hilo que llama no se sienta y espera la respuesta, ni tampoco ocurre la actividad asincrónica en el hilo de llamada.
Más allá de eso, vas a necesitar ser más específico.
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 asíncrona cuando la respuesta regrese.
John Resig tiene una buena explicación de la cuestión relacionada de cómo funcionan los temporizadores en JavaScript .
La naturaleza de las llamadas asíncronas es tal que, si desea que la aplicación continúe ejecutándose mientras la llamada está en progreso, necesitará 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 el usuario tenga la sensación de ser sincrónico (es decir, bloquear hasta que el método asíncrono haya indicado que se ha completado). Esto se puede lograr a través de API Win32 como WaitForSingleObject .
Las llamadas asincrónicas ni siquiera tienen que ocurrir en el mismo sistema / dispositivo que el que invoca la llamada. Entonces, si la pregunta es si una llamada asíncrona requiere un hilo en el proceso actual, la respuesta es no. Sin embargo, debe haber un hilo de ejecución en algún lugar procesando la solicitud asincrónica.
El hilo de la ejecución es un término vago. En un sistema cooperativo de tareas 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 las personas generalmente hablan de llamadas asincrónicas , típicamente significan llamadas que son manejadas por otro hilo 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 interproceso) (IPC) generalmente se generaliza para incluir la comunicación dentro del proceso, ya que las técnicas para bloquear y sincronizar datos son generalmente las mismas independientemente del proceso en el que se ejecutan los hilos de ejecución.
Multi threading 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 la programación asincrónica 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 terminado de procesar la solicitud. Ahora el hilo principal puede procesar el resultado.
No, las llamadas asincrónicas no siempre involucran hilos.
Por lo general, comienzan 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 otra computadora en la red, o por un ser humano. Los hilos no son la única forma de hacer las cosas en paralelo.
Siempre que la operación que debe ocurrir de forma asíncrona no requiera que la CPU haga el trabajo, esa operación puede realizarse sin generar otra secuencia. Por ejemplo, si la operación de sincronización es de E / S, la CPU no tiene que esperar a que se complete la E / S. Solo necesita iniciar la operación y luego pasar a otro trabajo mientras el hardware de E / S (controlador de disco, interfaz de red, etc.) funciona. El hardware le permite a la CPU saber cuándo ha terminado al interrumpir la CPU, y el sistema operativo luego entrega el evento a su aplicación.
Con frecuencia, las abstracciones de alto nivel y las API no exponen las API asíncronas subyacentes disponibles desde el sistema operativo y el hardware subyacente. En esos casos, generalmente es más fácil crear subprocesos para realizar operaciones asíncronas, incluso si el subproceso generado está esperando en una operación de E / S.
Si la operación asíncrona requiere que la CPU trabaje, generalmente esa operación tiene que ocurrir en otra cadena para que sea realmente asíncrona. Incluso entonces, realmente solo será asincrónico si hay más de una unidad de ejecución.
Una operación asíncrona es una operación que continúa en segundo plano después de iniciarse, sin forzar a la persona que llama a esperar que termine antes de ejecutar otro código.
En lugar de bloquear el programa llamante (o subproceso) hasta que llegue una respuesta, una implementación asincrónica (también llamada no bloqueante) enviará una solicitud a la base de datos o servicio web o lo que sea, luego regresará inmediatamente, permitiendo que su programa continúe ejecutando otro código mientras que el servicio remoto envía una respuesta. Una vez que llega la respuesta, el sistema ejecutará una devolución de llamada (ya sea en su bucle de mensajes o en un subproceso de puerto de terminación de E / S por separado, dependiendo del entorno), permitiendo que su código maneje la respuesta.
Multi-threading significa ejecutar más de un hilo de ejecución a la vez. En este modelo, todas las operaciones siguen sincronizadas, pero la CPU ejecutará varios hilos de operaciones síncronas al mismo tiempo.
El multi-threading tiene más sentido cuando se llama a operaciones múltiples (e independientes) vinculadas a la CPU, en un procesador multi-core. Por ejemplo, un programa que analice de forma independiente cada píxel de una imagen podría dividir la imagen en una tira para cada núcleo de CPU, y luego analizar cada tira en su propio hilo al mismo tiempo.
Lea más aquí - https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/
Windows siempre tuvo un proceso asíncrono desde los tiempos no preventivos (versiones 2.13, 3.0, 3.1, etc.) utilizando el bucle de mensajes, mucho antes de admitir subprocesos reales. Entonces, para responder a su pregunta, no, no es necesario crear un hilo para realizar un procesamiento asíncrono.