multithreading - sincronas - que es programación asíncrona
¿Cómo articular la diferencia entre programación asincrónica y paralela? (10)
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 mente, así como para otros.
Soy un programador workaday y uso asincronización y callbacks bastante a menudo. El paralelismo se siente exótico.
Pero siento que se combinan fácilmente, especialmente en el 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 se aplica mejor.
Asincrónico: ejecuta un método o tarea en segundo plano, sin bloquear. Puede que necesariamente no se ejecute en un hilo separado. Utiliza el cambio de contexto / programación de tiempo.
Tareas paralelas: cada tarea se ejecuta de forma paralela. No usa el cambio de contexto / programación de tiempo.
Creo que la distinción principal es entre concurrencia y paralelismo .
Async y Callbacks son generalmente una forma (herramienta o mecanismo) para expresar concurrencia, es decir, un conjunto de entidades posiblemente hablando entre sí y compartiendo recursos. En el caso de la comunicación asincrónica o de devolución de llamada está implícito, mientras que el intercambio de recursos es opcional (considere la RMI donde los resultados se calculan en una máquina remota). Como se señaló correctamente, esto generalmente se hace teniendo en cuenta la capacidad de respuesta; para no esperar largos eventos de latencia
La programación paralela generalmente tiene un rendimiento como el objetivo principal mientras que la latencia, es decir, el tiempo de finalización para un solo elemento, podría ser peor que un programa secuencial equivalente.
Para comprender mejor la distinción entre concurrencia y paralelismo, voy a citar los modelos probabilísticos de 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 como 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 involucran un control central que distribuye el trabajo entre varios procesadores. En concurrencia hacemos hincapié en 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 en cierto modo un caso especial de concurrencia en el que las entidades independientes colaboran para obtener un alto rendimiento y rendimiento (en general).
Async y Callbacks son solo un mecanismo que le permite al programador expresar concurrencia. Tenga en cuenta que los patrones de diseño de programación paralelos bien conocidos, como maestro / trabajador o mapa / reducir, se implementan mediante marcos que utilizan mecanismos de nivel inferior (asincrónico) para implementar interacciones centralizadas más complejas.
Cuando ejecuta algo de forma asincrónica, significa que no bloquea, lo ejecuta sin esperar a que se complete y continuar con otras cosas. Paralelismo significa ejecutar varias cosas al mismo tiempo, en paralelo. El paralelismo funciona bien cuando puedes separar tareas en trabajos independientes.
Tomemos como ejemplo renderizar cuadros de una animación 3D. Para renderizar la animación lleva mucho tiempo, por lo que si ejecutara el renderizado desde el software de edición de animación, se aseguraría de que se ejecutara de forma asíncrona, de modo que no bloqueara su UI y podría continuar haciendo otras cosas. Ahora, cada fotograma 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 procesar múltiples marcos en paralelo para acelerar la carga de trabajo general.
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ónico es equívoca.
Ejecuto una tarea asíncrona cuando le digo a mi mayordomo que corra a la tienda por más vino y queso, y luego me olvido de él y trabajo en mi novela hasta que golpea la puerta del estudio de nuevo. 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 está trabajando en paralelo cuando cada uno de ellos está lavando una ventana diferente.
Mi equipo de soporte de autos de carrera es paralelo asíncrono en que cada equipo trabaja con un neumático diferente y no necesitan comunicarse entre sí ni administrar recursos compartidos mientras hacen su trabajo.
Mi equipo de fútbol (también conocido como fútbol) trabaja en paralelo ya que cada jugador procesa de forma independiente la información sobre el campo y se mueve sobre ella, pero no son completamente asincrónicos porque deben comunicarse y responder a la comunicación de los demás.
Mi banda de marcha también es paralela, ya que cada jugador lee música y controla su instrumento, pero son muy sincrónicos: juegan y marchan el uno con el otro.
Una pistola Gatling cammed podría considerarse paralela, pero todo es 100% sincrónico, por lo que es como si un proceso avanzara.
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. [Dicha llamada] se derivará en un hilo ya existente (como un hilo de E / S) y realizará su tarea cuando sea posible.
esto acerca de la programación paralela:
En la programación paralela, aún se divide el trabajo o las tareas, pero la diferencia clave es que se generan nuevos hilos para cada porción de trabajo.
y esto en resumen:
las llamadas asincrónicas usarán los hilos que ya están siendo utilizados por el sistema y la programación paralela requiere que el desarrollador rompa los hilos de trabajo, arranque y desmontaje necesarios .
Mi entendimiento básico es:
La programación asincrónica resuelve el problema de esperar que se complete una operación costosa antes de poder hacer cualquier otra cosa. Si puede hacer otras cosas mientras espera que la operación se complete, eso es algo bueno. Ejemplo: mantener una UI ejecutándose mientras vas y recuperar más datos de un servicio web.
La programación paralela está relacionada, pero está más relacionada con dividir una tarea grande en trozos más pequeños que se pueden computar al mismo tiempo. Los resultados de los trozos más pequeños se pueden combinar para producir el resultado global. Ejemplo: ray-tracing 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.
Tiendo a pensar en la diferencia en estos términos:
Asíncrono: Vete y haz esta tarea, cuando termines regresa y cuéntame y trae los resultados. Mientras tanto, continuaré con otras cosas.
Paralelo: quiero que hagas esta tarea. Si lo hace más fácil, haga que algunas personas lo ayuden. Esto es urgente, así que esperaré aquí hasta que vuelvas con los resultados. No puedo hacer nada más hasta que regreses.
Por supuesto, una tarea asincrónica podría hacer uso del paralelismo, pero la diferenciación, al menos para mi mente, es si te llevas bien con otras cosas mientras la operación se lleva a cabo o si paras todo completamente hasta que los resultados estén dentro.
Vine aquí bastante cómodo con los dos conceptos, pero con algo que no tengo 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 piensas en tus líneas individuales de código como cartas separadas pero ordenadas (detente si estoy explicando cómo funcionan las tarjetas perforadas de la vieja escuela), entonces para cada procedimiento separado escrito tendrás una pila única de cartas (no copies & paste!) y la diferencia entre lo que normalmente sucede cuando se ejecuta el código de manera normal y asíncrona depende de si le 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 pasarlas al procesador. Con un procesador, solo se puede ejecutar una línea de código al mismo tiempo. Entonces, para lograr la ilusión de ejecutar múltiples procesos al mismo tiempo, el sistema operativo usa 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 a cómo ve. ajuste. El resultado son múltiples procesos que muestran el progreso al 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 cartas antes de enviarlas al procesador. Si tu pila de cartas no depende de otra pila, no notarás que tu pila dejó de ser seleccionada mientras otra pila se activó. Entonces, si no te importa, no importa.
Sin embargo, si le importa (p. Ej., Hay múltiples procesos, o montones de tarjetas) que dependen uno del otro), la reorganización del sistema operativo arruinará sus resultados.
Escribir código asíncrono requiere manejar las dependencias entre el orden de ejecución, independientemente de cómo termine ese orden. Esta es la razón por la cual se usan constructos como "call-backs". 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 se notifica antes de permitir que el sistema operativo ejecute más de sus instrucciones. ("If called_back == false: send (no_operation)" - no estoy seguro si esta es en realidad la forma en que se implementa, pero lógicamente creo que es consistente)
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, puede que necesite combinar los resultados de las dos pilas, lo que entonces sería una cuestión de sincronicidad, pero, para la ejecución, no le importa más.
No estoy seguro si esto ayuda, pero siempre encuentro muchas explicaciones útiles. También tenga en cuenta que la ejecución asincrónica no está restringida a una computadora individual y sus procesadores. En términos generales, se trata del tiempo, o (aún más generalmente hablando) un orden de eventos. Entonces, si envía la pila A dependiente al nodo de red X y su pila acoplada B a Y, el código asíncrono correcto debería ser capaz de dar cuenta de la situación como si se estuviera ejecutando localmente en su computadora portátil.
¿Por qué asincrónico?
Con la aplicación de hoy crece cada vez más tareas conectadas y potencialmente de larga ejecución u operaciones de bloqueo como E / S de red u operaciones de base de datos. Por lo tanto, es muy importante ocultar la latencia de estas operaciones comenzando en segundo plano y regresando a la interfaz de usuario lo mas rapido posible. Aquí asíncrono entra en la imagen, capacidad de respuesta .
¿Por qué la 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 CPU, en este caso, dividiendo la carga de trabajo en fragmentos y luego ejecutando esos fragmentos simultáneamente. Podemos llamar esto como "Paralelo". Obviamente, dará un alto rendimiento a nuestra aplicación.
asincrónico : hazlo tú solo en otro lugar y notifícame cuando lo completes (devolución de llamada). Para el momento en que pueda continuar haciendo lo mío.
Paralelo : contrate tantos tipos (hilos) como desee y divídales el trabajo para completarlo más rápido y hágamelo saber (devolución de llamada) cuando lo complete. Para cuando pueda continuar haciendo mis otras cosas.
la principal diferencia es el paralelismo principalmente depende del hardware.