¿Cómo articular la diferencia entre programación asíncrona y paralela?


139

Muchas plataformas promueven la asincronía y el paralelismo como medios para mejorar la capacidad de respuesta. Entiendo la diferencia en general, pero a menudo me resulta difícil articular en mi propia mente, así como para los demás.

Soy un programador de trabajo diario y uso asíncrona y devoluciones de llamada con bastante frecuencia. El paralelismo se siente exótico.

Pero siento que se combinan fácilmente, especialmente a nivel de diseño del lenguaje. Me encantaría una descripción clara de cómo se relacionan (o no), y las clases de programas donde cada uno se aplica mejor.


Escribí una publicación de blog sobre la relación entre la programación asíncrona y paralela - anat-async.blogspot.com/2018/08/…
Alexei Kaigorodov


66
paralelismo es cuando las cosas suceden simultáneamente. La asincronía es cuando no te molestas en esperar que el resultado de una acción continúe. Simplemente te vas a dormir y en algún momento más tarde llega el resultado, suena la campana, te despiertas y continúas desde allí. La ejecución asincrónica puede suceder perfectamente en serie en un solo hilo. (eso es más o menos lo que hace javascript)
Thanasis Ioannidis

Respuestas:


87

Cuando ejecuta algo de forma asincrónica, significa que no se bloquea, lo ejecuta sin esperar a que se complete y continúe con otras cosas. Paralelismo significa ejecutar múltiples cosas al mismo tiempo, en paralelo. El paralelismo funciona bien cuando puede separar las tareas en piezas de trabajo independientes.

Tomemos, por ejemplo, cuadros de representación de una animación 3D. La representación de la animación lleva mucho tiempo, por lo que si iniciara esa representación desde su software de edición de animación, se aseguraría de que se ejecutara de forma asincrónica para que no bloqueara su IU y pudiera continuar haciendo otras cosas. Ahora, cada cuadro de esa animación también se puede considerar como una tarea individual. Si tenemos múltiples CPU / núcleos o múltiples máquinas disponibles, podemos renderizar múltiples marcos en paralelo para acelerar la carga de trabajo general.


Déjame ver si consigo esto. Las tareas paralelas de renderizar los diferentes marcos deben extenderse a través de múltiples CPU / núcleos. Eso no tiene nada que ver con el momento de la finalización de la tarea, o si esa tarea bloquea otra cosa. Simplemente significa que un montón de CPU lo harán juntos y harán que el resultado esté disponible como si se ejecutara en una CPU súper rápida. ¿Correcto?

1
"Procesar la animación lleva mucho tiempo, por lo que si lanzara ese procesamiento desde su software de edición de animación, se aseguraría de (...)". ¿Qué?

Para la parte de animación en 3D: en primer lugar, NUNCA ejecutarías un programa de gráficos en 3D con generación de cuadros en la CPU; cualquier persona sensata sugeriría inmediatamente usar la GPU. En segundo lugar, si hacemos esto (muy desanimados) usaríamos un temporizador para medir cuántos fotogramas podemos renderizar, de lo contrario podríamos terminar acumulando una pila de tareas de renderizado sin terminar. Pero su punto es perfectamente válido con la mayoría de las aplicaciones de renderizado 2D que se renderizan por evento de entrada por usuario.
ワ イ き ん ぐ

1
Asíncrono y sin bloqueo son paradigmas diferentes .
Marqués de Lorne

72

Creo que la distinción principal es entre concurrencia y paralelismo .

La sincronización y las devoluciones de llamada generalmente son una forma (herramienta o mecanismo) de expresar concurrencia, es decir, un conjunto de entidades que posiblemente se comuniquen entre sí y compartan recursos. En el caso de la comunicación asíncrona o de devolución de llamada está implícita, mientras que compartir recursos es opcional (considere RMI donde los resultados se calculan en una máquina remota). Como se señaló correctamente, esto generalmente se hace con la capacidad de respuesta en mente; no esperar a eventos de latencia largos .

La programación paralela generalmente tiene el rendimiento como objetivo principal, mientras que la latencia, es decir, el tiempo de finalización para un solo elemento, puede ser peor que un programa secuencial equivalente.

Para comprender mejor la distinción entre concurrencia y paralelismo, voy a citar los modelos probabilísticos para la concurrencia de Daniele Varacca, que es un buen conjunto de notas para la teoría de la concurrencia:

Un modelo de computación es un modelo de concurrencia cuando es capaz de representar sistemas compuestos de componentes autónomos independientes, posiblemente comunicándose entre sí. La noción de concurrencia no debe confundirse con la noción de paralelismo. Los cálculos paralelos generalmente implican un control central que distribuye el trabajo entre varios procesadores. Al mismo tiempo, destacamos la independencia de los componentes y el hecho de que se comunican entre sí. El paralelismo es como el antiguo Egipto, donde el faraón decide y los esclavos trabajan. La concurrencia es como la Italia moderna, donde todos hacen lo que quieren y todos usan teléfonos móviles.

En conclusión , la programación paralela es un caso especial de concurrencia donde entidades separadas colaboran para obtener un alto rendimiento y rendimiento (generalmente).

Async y Callbacks son solo un mecanismo que permite al programador expresar concurrencia. Tenga en cuenta que los patrones de diseño de programación paralela conocidos, como maestro / trabajador o mapa / reducción, se implementan mediante marcos que utilizan mecanismos de nivel inferior (asíncrono) para implementar interacciones centralizadas más complejas .


37

Este artículo lo explica muy bien: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

Tiene esto sobre la programación asincrónica:

Las llamadas asincrónicas se utilizan para evitar el "bloqueo" dentro de una aplicación. [Tal] llamada derivará en un subproceso ya existente (como un subproceso de E / S) y realizará su tarea cuando pueda.

esto acerca de la programación paralela:

En la programación paralela, aún divide el trabajo o las tareas, pero la diferencia clave es que genera nuevos hilos para cada porción de trabajo.

y esto en resumen:

las llamadas asincrónicas utilizarán subprocesos que ya están en uso por el sistema y la programación paralela requiere que el desarrollador interrumpa los subprocesos necesarios para el trabajo, la rotación y el desmontaje .


3
Este artículo> todas las respuestas aquí (¡excepto esta, por supuesto!)
FellyTone84

1
Gracias por el enlace. Entonces ... en general , use llamadas asíncronas cuando se comunique desde la IU al servidor (o desde un cliente a un servicio web). Utilice subprocesos paralelos en el servidor o en el extremo del servicio web, así como en su capa empresarial.
goku_da_master

18

Mi comprensión básica es:

La programación asincrónica resuelve el problema de esperar a que se complete una operación costosa antes de poder hacer cualquier otra cosa. Si puede hacer otras cosas mientras espera que se complete la operación, entonces eso es algo bueno. Ejemplo: mantener una IU ejecutándose mientras se va y recuperar más datos de un servicio web.

La programación paralela está relacionada, pero está más preocupada por dividir una tarea grande en fragmentos más pequeños que se pueden calcular al mismo tiempo. Los resultados de los trozos más pequeños se pueden combinar para producir el resultado general. Ejemplo: trazado de rayos donde el color de los píxeles individuales es esencialmente independiente.

Probablemente sea más complicado que eso, pero creo que esa es la distinción básica.


Esto está muy bien, pero está bastante mal. Al igual que la asincronía, el paralelismo también permite que el flujo de control continúe sin esperar a que se completen las acciones. La diferencia principal es que el paralelismo depende del hardware.
serkan

13

Tiendo a pensar en la diferencia en estos términos:

Asíncrono: vete y haz esta tarea, cuando hayas terminado regresa y dímelo y trae los resultados. Seguiré adelante con otras cosas mientras tanto.

Paralelo: quiero que hagas esta tarea. Si lo hace más fácil, solicite ayuda a algunas personas. Sin embargo, esto es urgente, así que esperaré aquí hasta que regrese con los resultados. No puedo hacer nada más hasta que vuelvas.

Por supuesto, una tarea asincrónica podría hacer uso del paralelismo, pero la diferenciación, al menos en mi opinión, es si usted continúa con otras cosas mientras se lleva a cabo la operación o si detiene todo por completo hasta que los resultados estén listos.


13

asíncrono : hágalo usted mismo en otro lugar y notifíqueme cuando complete (devolución de llamada). Para cuando pueda seguir haciendo lo mío.

ingrese la descripción de la imagen aquí

Paralelamente : contrate a tantos hombres (hilos) como desee y divídales el trabajo para que se completen más rápido y avíseme (devolución de llamada) cuando complete. Para cuando pueda continuar haciendo mis otras cosas.

ingrese la descripción de la imagen aquí

La principal diferencia es que el paralelismo depende principalmente del hardware.


11

Es una cuestión de orden de ejecución.

Si A es asíncrono con B, entonces no puedo predecir de antemano cuándo ocurrirán las subpartes de A con respecto a las subpartes de B.

Si A es paralelo a B, entonces las cosas en A están sucediendo al mismo tiempo que las cosas en B. Sin embargo, aún se puede definir un orden de ejecución.

Quizás la dificultad es que la palabra asincrónica es equívoca.

Ejecuto una tarea asincrónica cuando le digo a mi mayordomo que corra a la tienda por más vino y queso, y luego me olvide de él y trabaje en mi novela hasta que vuelva a tocar la puerta del estudio. El paralelismo está sucediendo aquí, pero el mayordomo y yo estamos involucrados en tareas fundamentalmente diferentes y de diferentes clases sociales, por lo que no aplicamos esa etiqueta aquí.

Mi equipo de mucamas trabaja en paralelo cuando cada una de ellas está lavando una ventana diferente.

Mi equipo de soporte de autos de carrera es asincrónicamente paralelo en el sentido de que cada equipo trabaja en un neumático diferente y no necesitan comunicarse entre sí o administrar recursos compartidos mientras hacen su trabajo.

Mi equipo de fútbol (también conocido como fútbol) hace un trabajo paralelo ya que cada jugador procesa de manera independiente la información sobre el campo y se mueve sobre él, pero no son completamente asíncronos porque deben comunicarse y responder a la comunicación de los demás.

Mi banda de música también es paralela, ya que cada jugador lee música y controla su instrumento, pero están muy sincronizados: tocan y marchan al mismo tiempo.

Una pistola de levas podría considerarse paralela, pero todo es 100% sincrónico, por lo que es como si un proceso avanzara.


9

¿Por qué asincrónico?

Dado que las aplicaciones actuales están cada vez más conectadas y también potencialmente ejecutan tareas de larga duración u operaciones de bloqueo, como E / S de red u Operaciones de base de datos, es muy importante ocultar la latencia de estas operaciones al iniciarlas en segundo plano y volver a la interfaz de usuario lo mas rapido posible. Aquí Asynchronous entra en escena, receptividad .

¿Por qué programación paralela?

Con los conjuntos de datos actuales cada vez más grandes y los cálculos cada vez más complejos. Por lo tanto, es muy importante reducir el tiempo de ejecución de estas operaciones vinculadas a la CPU, en este caso, dividiendo la carga de trabajo en fragmentos y luego ejecutando esos fragmentos simultáneamente. Podemos llamar a esto como "Paralelo". Obviamente le dará un alto rendimiento a nuestra aplicación.


5

Asincrónico Digamos que usted es el punto de contacto para su cliente y necesita ser receptivo, es decir, debe compartir el estado, la complejidad de la operación, los recursos necesarios, etc., siempre que se le solicite. Ahora tiene que realizar una operación que requiere mucho tiempo y, por lo tanto, no puede continuar con esto, ya que debe responder al cliente 24/7. Por lo tanto, delega la operación que lleva mucho tiempo a otra persona para que pueda responder. Esto es asincrónico.

Programación paralela Supongamos que tiene una tarea para leer, digamos, 100 líneas de un archivo de texto, y leer una línea lleva 1 segundo. Por lo tanto, necesitará 100 segundos para leer el archivo de texto. Ahora le preocupa que el cliente deba esperar 100 segundos para que finalice la operación. Por lo tanto, crea 9 clones más y hace que cada uno de ellos lea 10 líneas del archivo de texto. Ahora el tiempo necesario es de solo 10 segundos para leer 100 líneas. Por lo tanto, tiene un mejor rendimiento.

En resumen, la codificación asincrónica se realiza para lograr capacidad de respuesta y la programación paralela se realiza para el rendimiento.


4

Asincrónico: ejecutar un método o tarea en segundo plano, sin bloquear. Es posible que no se ejecute necesariamente en un subproceso separado. Utiliza cambio de contexto / programación de tiempo.

Tareas paralelas: cada tarea se ejecuta paralelamente. No utiliza cambio de contexto / programación de tiempo.


4

Vine aquí bastante cómodo con los dos conceptos, pero con algo que no me queda claro sobre ellos.

Después de leer algunas de las respuestas, creo que tengo una metáfora correcta y útil para describir la diferencia.

Si piensa en sus líneas de código individuales como cartas de juego separadas pero ordenadas (deténgame si le estoy explicando cómo funcionan las tarjetas perforadas de la vieja escuela), entonces, para cada procedimiento separado escrito, tendrá una pila única de cartas (no ¡copiar y pegar!) y la diferencia entre lo que normalmente sucede cuando se ejecuta el código normalmente y de forma asincrónica depende de si te importa o no.

Cuando ejecuta el código, le entrega al sistema operativo un conjunto de operaciones individuales (en las que su compilador o intérprete rompió su código de nivel "superior") para que se lo pase al procesador. Con un procesador, solo se puede ejecutar una línea de código a la vez. Entonces, para lograr la ilusión de ejecutar múltiples procesos al mismo tiempo, el sistema operativo utiliza una técnica en la que envía al procesador solo unas pocas líneas de un proceso dado a la vez, alternando entre todos los procesos de acuerdo con cómo ve ajuste. El resultado son múltiples procesos que muestran el progreso para el usuario final en lo que parece ser al mismo tiempo.

Para nuestra metáfora, la relación es que el sistema operativo siempre baraja las tarjetas antes de enviarlas al procesador. Si su pila de cartas no depende de otra pila, no se da cuenta de que dejó de ser seleccionada mientras otra pila se activaba. Entonces, si no te importa, no importa.

Sin embargo, si le importa (p. Ej., Hay múltiples procesos, o pilas de tarjetas, que dependen unos de otros), entonces la combinación aleatoria del sistema operativo arruinará sus resultados.

Escribir código asincrónico requiere manejar las dependencias entre el orden de ejecución, independientemente de cuál sea el orden. Esta es la razón por la cual se utilizan construcciones como "devoluciones de llamada". Le dicen al procesador, "lo siguiente que debe hacer es decirle a la otra pila lo que hicimos". Al usar tales herramientas, puede estar seguro de que la otra pila recibe una notificación antes de permitir que el sistema operativo ejecute más de sus instrucciones. ("If called_back == false: send (no_operation)" - no estoy seguro de si así es como se implementa, pero lógicamente, creo que es coherente).

Para procesos paralelos, la diferencia es que tiene dos pilas que no se preocupan entre sí y dos trabajadores para procesarlas. Al final del día, es posible que deba combinar los resultados de las dos pilas, lo que sería una cuestión de sincronía, pero, para la ejecución, no volverá a importarle.

No estoy seguro si esto ayuda, pero siempre encuentro útiles las explicaciones múltiples. Además, tenga en cuenta que la ejecución asincrónica no está limitada a una computadora individual y sus procesadores. En términos generales, se trata del tiempo, o (incluso más en general) un orden de eventos. Entonces, si envía la pila dependiente A al nodo de red X y su pila acoplada B a Y, el código asincrónico correcto debería ser capaz de explicar la situación como si se estuviera ejecutando localmente en su computadora portátil.


2

En general, solo hay dos formas de hacer más de una cosa cada vez. Uno es asíncrono , el otro es paralelo .

Desde el alto nivel, como el popular servidor NGINX y la famosa biblioteca de Python Tornado , ambos utilizan completamente el paradigma asincrónico, que es un servidor de un solo hilo que podría servir simultáneamente a miles de clientes (algunos IOloop y devolución de llamada ). Usando ECF (control de excepción a continuación) que podría implementar el paradigma de programación asincrónica. así que, a veces, asíncrono en realidad no hace cosas simultáneamente, pero algo de trabajo enlazado, asíncrono realmente podría promover el rendimiento.

El paradigma paralelo siempre se refiere a subprocesos múltiples y multiprocesamiento. Esto puede utilizar completamente procesadores multi-core, hacer cosas realmente simultáneamente.


-1

Resumen de todas las respuestas anteriores

  1. computación paralela:

▪ resuelve problemas de rendimiento. Preocupado por dividir una tarea grande en trozos más pequeños

▪ está relacionado con la máquina (se necesita máquina múltiple / núcleo / CPU / procesador), por ejemplo: maestro esclavo, reducción de mapa

Los cálculos paralelos generalmente implican un control central que distribuye el trabajo entre varios procesadores

  1. asincrónico:

▪ resuelve el problema de latencia, es decir, el problema de 'esperar' a que se complete una operación costosa antes de que pueda hacer cualquier otra cosa

▪ está relacionado con el hilo (se necesita un hilo múltiple)

El enhebrado (usando Thread, Runnable, Executor) es una forma fundamental de realizar operaciones asincrónicas en Java

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.