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.
multithreading
asynchronous
parallel-processing
Matt Sherman
fuente
fuente
Respuestas:
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.
fuente
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:
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 .
fuente
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:
esto acerca de la programación paralela:
y esto en resumen:
fuente
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.
fuente
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.
fuente
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.
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.
La principal diferencia es que el paralelismo depende principalmente del hardware.
fuente
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.
fuente
¿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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
Resumen de todas las respuestas anteriores
▪ 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
▪ 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
fuente