Asincrónico vs Multithreading - ¿Hay alguna diferencia?

133

¿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?

Wikipedia dice :

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?

Ted Smith
fuente
1
JavaScript no tiene subprocesos, pero sí tiene llamadas a métodos asincrónicos.
Ajedi32
1
Cualquier sistema donde un proceso gestiona múltiples subprocesos, el proceso de control puede proporcionar una operación asincrónica de los subprocesos. En el caso de JavaScript, el navegador proporciona la secuencia de proceso. Cuando alguna función realiza una llamada asíncrona, el navegador puede almacenar el contexto para esa función. Ahora ese mismo hilo del navegador puede cambiar el contexto para reanudar la ejecución de otra función. Mientras que en los programas multiproceso tradicionales, un subproceso realiza bloques de una función para permitir que otro subproceso ejecute una función diferente. Cada hilo realiza su propia función sincrónicamente.
Mike

Respuestas:

82

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.

Michael Kohne
fuente
77
Básicamente, estoy en lo cierto al decir: Multi-threading == Uso de múltiples hilos para proporcionar beneficios de procesamiento en tareas intensivas de procesador que son [idealmente] capaces de beneficiarse de los múltiples procesadores, así como beneficios en situaciones asincrónicas. Asynchrony == un proceso que hace lo suyo, mientras que el estado que llamó al proceso no tiene que esperar a que se complete. (No necesariamente puede usar múltiples subprocesos para hacer esto, es decir, otros componentes de hardware pueden asumir la responsabilidad).
Evan Sevy
66
@Michael - ¿Podría explicar cómo podría ocurrir la programación asincrónica en un solo hilo con un ejemplo?
Kumar Vaibhav
77
@KumarVaibhav: el ejemplo más común es cuando un solo hilo funciona en elementos de una cola (por ejemplo, la cola de mensajes de Windows). Si el programa tiene la costumbre de enviar elementos a su propia cola (un patrón común), entonces el bit de código que envía el elemento no espera a que termine la operación, sino que simplemente regresa. La operación será atendida a su debido tiempo por el bucle principal.
Michael Kohne
3
Puede haber una diferencia entre cómo se escribe el código y cómo se ejecuta. Por ejemplo, en C #, puedo tener un método que inicie una tarea asíncrona, mi método es totalmente asíncrono y puede hacer otras cosas sin esperar a que se complete la tarea. Sin embargo, el CLR también puede decidir en línea mi tarea y ejecutarla sincrónicamente.
Mike
¿Qué hilo ejecuta la tarea esperada? el método marcado con a-sync se ejecuta sincrónicamente hasta que alcanza la palabra clave wait, en este punto, ¿qué hilo ejecuta esta tarea de espera?
102

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.

karunski
fuente
1
Bien explicado, gracias; Pero tengo una pregunta aquí. Usted mencionó que "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". Mi pregunta es cuando el programa tiene un solo subproceso y, en la línea de código 3, dice que llama a una operación de E / S, entonces, ¿cómo puede iniciar la operación en la línea 3 y ejecutar la línea 4 sin esperar a que se complete la operación de E / S? ? Para mí, tengo que poner el código en la línea 3 en un nuevo hilo para lograr que la línea 4 se ejecute sin esperar la finalización de la operación de E / S. [Perspectiva de pgm de Java]
spiderman
1
La razón es que, aunque la CPU no tiene que esperar, la CPU esperará a que se complete la operación de E / S ... Creo que su segundo párrafo es la respuesta para mi consulta. En tal caso, necesito concluir que en Java, las llamadas asincrónicas deben ejecutarse en un hilo diferente. Corrígeme si estoy equivocado o avísame si tengo que publicar un nuevo SO qn
spiderman
@spiderman Algunos lenguajes, como Node.js, tienen un modelo de programación asíncrono. El lenguaje y el tiempo de ejecución proporcionan funciones integradas que permiten ejecutar la línea 4 en el mismo subproceso, incluso antes de que se complete la operación de E / S. Esto se logra mediante la línea 3 que proporciona una devolución de llamada que invocará el tiempo de ejecución cuando finalice el IO.
jrahhali
@spiderman quizás ... la función Async del sistema operativo simplemente devuelve falso o algo directamente.
Byeongin Yoon
18

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.

Jason Orendorff
fuente
12

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 .

George V. Reilly
fuente
12

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.

Murugan Gopalan
fuente
No estaría de acuerdo un poco. Escribí un servidor HTTP de un solo subproceso que manejaba múltiples solicitudes simultáneas usando la finalización asíncrona de E / S. Async no requiere que sucedan cosas en múltiples rutas de ejecución, solo significa que se pueden superponer varias secuencias de cómputo. Otra forma de verlo es que en un sistema operativo de un solo subproceso, puedo tener 2 procesos ejecutándose "simultáneamente". Desde el punto de vista de cada proceso, se ejecutan sincrónicamente. Sin embargo, desde el punto de vista del sistema operativo, funciona de forma asíncrona.
Mike
11

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.

Otávio Décio
fuente
@dmckee: es interesante cómo evolucionan los diferentes sistemas de manera similar.
Otávio Décio
8

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.

Miguel
fuente
7

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 .

dmckee --- gatito ex moderador
fuente
5

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:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results
Milan Babuškov
fuente
2

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 .

LeopardSkinPillBoxHat
fuente
Esto es cierto en algunos sistemas, pero no en todos. Unix no requiere que generes o utilices otro hilo, a menos que llames al núcleo otro hilo, lo que supongo es una forma de verlo.
Craig S
Esto tampoco es cierto en Windows. La E / S superpuesta, por ejemplo, es asíncrona.
Jason Orendorff