asynchronous - how - Ejecución asíncrona vs sincrónica, ¿qué significa realmente?
script defer (21)
Al ejecutar una secuencia como: a> b> c> d>, si obtenemos una falla en medio de la ejecución como:
a
b
c
fail
Luego volvemos a empezar desde el principio:
a
b
c
d
esto es sincrónico
Sin embargo, si tenemos la misma secuencia para ejecutar: a> b> c> d>, y tenemos una falla en el medio:
a
b
c
fail
... pero en lugar de reiniciar desde el principio, reiniciamos desde el punto de falla:
c
d
... esto se conoce como asíncrono.
¿Cuál es la diferencia entre ejecución asíncrona y síncrona?
Básicamente, síncrono significa que solo se puede ejecutar una cosa a la vez. Asíncrono significa que puede ejecutar varias cosas a la vez y no tiene que terminar de ejecutar la cosa actual para pasar a la siguiente.
Como un ejemplo muy simple,
SINCRÓNICO
Imagina a 10 alumnos de escuela instruidos para caminar como una cola en una carretera.
El 3er alumno se desató el cordón del zapato. Ahora ella se ha detenido y se ha vuelto a atar.
Todos los estudiantes que están detrás de ella se han detenido, y ahora están esperando que se lo aten. Los estudiantes de primero y segundo pasaron junto a todos y continuaron su ritmo habitual.
10-->9-->8-->7-->6-->5-->4-->3. 2-->1-->
ASINCRÓNICO
Solo imagina 10 personas al azar caminando en el mismo camino. Por supuesto, no están en una cola, solo caminan al azar en diferentes lugares de la carretera a diferentes pasos.
El cordón de la tercera persona se desató. Se detuvo para atarlo de nuevo.
Pero nadie la está esperando para que se la aten. Todos los demás siguen caminando de la misma manera que lo hacían antes, al mismo ritmo que ellos.
10--> 9-->
8--> 7--> 6-->
5--> 4--> 3. 2-->
1-->
Creo que esta es una pequeña explicación, pero aún así se aclara usando ejemplos de la vida real.
Ejemplo pequeño:
Digamos que reproducir un audio implica tres pasos:
- Obteniendo la canción comprimida desde el disco duro
- Descomprima el audio.
- Reproduce el audio sin comprimir.
Si su reproductor de audio realiza el paso 1,2,3 secuencialmente para cada canción, entonces es sincrónico. Tendrá que esperar un tiempo para escuchar la canción hasta que la canción se recupere y descomprima.
Si su reproductor de audio realiza el paso 1,2,3 de forma independiente, entonces es asíncrono. es decir. Mientras se reproduce el audio 1 (paso 3), si recupera el audio 3 del disco duro en paralelo (paso 1) y descomprime el audio 2 en paralelo. (paso 2) Terminarás escuchando la canción sin esperar mucho para buscar y descomprimir.
Creo que una buena manera de pensarlo es en una carrera de relevos clásica.
Sincrónico : los procesos como miembros del mismo equipo, no se ejecutarán hasta que reciban la batuta (final de la ejecución del proceso / corredor anterior) y, sin embargo, todos actúan en sincronía entre sí.
Asíncrono : donde los procesos, como los miembros de diferentes equipos en la misma pista de relevo, se ejecutarán y se detendrán entre sí, pero dentro de la misma carrera (ejecución general del programa).
¿Tiene sentido?
Cuando ejecutas algo de forma sincrónica, esperas a que termine antes de pasar a otra tarea. Cuando ejecuta algo de forma asíncrona, puede pasar a otra tarea antes de que finalice.
Dicho esto, en el contexto de las computadoras, esto se traduce en la ejecución de un proceso o tarea en otro "hilo". Un hilo es una serie de comandos (un bloque de código) que existe como una unidad de trabajo. El sistema operativo puede administrar varios subprocesos y asignar a un subproceso una parte ("porción") de tiempo de procesador antes de cambiar a otro subproceso para darle un turno para hacer algún trabajo. En su núcleo (perdón por el juego de palabras), un procesador simplemente puede ejecutar un comando, no tiene el concepto de hacer dos cosas a la vez. El sistema operativo simula esto asignando porciones de tiempo a diferentes hilos.
Ahora, si introduce múltiples núcleos / procesadores en la mezcla, entonces las cosas PUEDEN suceder al mismo tiempo. El sistema operativo puede asignar tiempo a un subproceso en el primer procesador, y luego asignar el mismo bloque de tiempo a otro subproceso en un procesador diferente. Todo esto se trata de permitir que el sistema operativo administre la finalización de su tarea mientras usted puede ingresar su código y hacer otras cosas.
La programación asíncrona es un tema complicado debido a la semántica de cómo las cosas se unen cuando se pueden hacer al mismo tiempo. Existen numerosos artículos y libros sobre el tema; ¡echar un vistazo!
En lo que respecta a la definición " al mismo tiempo " de ejecución síncrona (que a veces es confusa), aquí hay una buena manera de entenderla:
Ejecución sincrónica : todas las tareas dentro de un bloque de código se ejecutan al mismo tiempo.
Ejecución asíncrona : no todas las tareas dentro de un bloque de código se ejecutan al mismo tiempo.
En pocas palabras, la sincronización se refiere a dos o más puntos de inicio y fin de procesos, NO a sus ejecuciones . En este ejemplo, el punto final del Proceso A está sincronizado con el punto de inicio del Proceso B:
SYNCHRONOUS |--------A--------| |--------B--------|
Los procesos asíncronos, por otro lado, no tienen sus puntos de inicio y finales sincronizados:
ASYNCHRONOUS |--------A--------| |--------B--------|
Cuando el Proceso A se superpone al Proceso B, se ejecutan de forma simultánea o synchronously (definición del diccionario), de ahí la confusión.
ACTUALIZACIÓN: Charles Bretana mejoró share , por lo que esta respuesta es ahora simplemente una mnemotécnica (potencialmente simplificada en exceso).
En términos más simples:
SINCRÓNICO
Usted está en una cola para obtener una entrada de cine. No puedes obtener uno hasta que todos los que están frente a ti obtengan uno, y lo mismo se aplica a las personas que están detrás de ti.
ASINCRÓNICO
Estás en un restaurante con muchas otras personas. Usted ordena su comida. Otras personas también pueden pedir su comida, no tienen que esperar a que su comida sea cocinada y servida antes de que puedan ordenar. En la cocina, los trabajadores del restaurante cocinan, sirven y reciben pedidos continuamente. La gente recibirá su comida tan pronto como se cocina.
Estás confundiendo Synchronous con Parallel vs Series. Sincrónico significa todo al mismo tiempo. Medios sincronizados relacionados entre sí que pueden significar en serie o en un intervalo fijo. Mientras que el programa está haciendo todo, se ejecuta en serie. Obtener un diccionario ... es por eso que tenemos té sin azúcar. Tienes té o té endulzado.
Sí, sincrónico significa al mismo tiempo, literalmente, significa hacer el trabajo todos juntos. múltiples seres humanos / objetos en el mundo pueden hacer varias cosas al mismo tiempo, pero si miramos la computadora, dice "medios sincrónicos" donde los procesos trabajan juntos, lo que significa que los procesos dependen del retorno de los demás y es por eso que se ejecutan. tras otro en la secuencia adecuada. Mientras que asíncrono significa que los procesos no funcionan juntos, pueden funcionar al mismo tiempo (si están en multiproceso), pero funcionan de manera independiente.
Simplemente dijo que la ejecución asíncrona está haciendo cosas en segundo plano.
Por ejemplo, si desea descargar un archivo de Internet, puede usar una función síncrona para hacerlo, pero bloqueará su hilo hasta que el archivo finalice la descarga. Esto puede hacer que su aplicación no responda a cualquier entrada del usuario.
En su lugar, puede descargar el archivo en segundo plano utilizando un método asíncrono. En este caso, la función de descarga regresa inmediatamente y la ejecución del programa continúa normalmente. Todas las operaciones de descarga se realizan en segundo plano y se notificará a su programa cuando finalice.
Sincrónico significa que la persona que llama espera la respuesta o la finalización, asincrónica de que la persona que llama continúa y la respuesta llega más tarde (si corresponde).
Como ejemplo:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Esto siempre saldrá:
Before call
In call
After call
Pero si tuviéramos que hacer doSomething asynchronous (varias formas de hacerlo), entonces la salida podría convertirse en:
Before call
After call
In call
Debido a que el método que realiza la llamada asíncrona continuará inmediatamente con la siguiente línea de código. Digo "podría", porque el orden de ejecución no se puede garantizar con operaciones asíncronas. También podría ejecutarse como el original, dependiendo de los tiempos de subproceso, etc.
Sincrónico significa que se ejecutará de forma en cola una a una tarea. Supongamos que solo se compartirá un vehículo que debe compartirse entre amigos para llegar a su destino uno por uno.
En caso asíncrono, cada amigo puede alquilar un vehículo y llegar a su destino.
Trataré de explicarlo de la manera más simple que pueda, así que (con suerte) recordará:
Ejecución sincrónica
Mi jefe es un hombre ocupado. Me dice que escriba el código. Yo le digo: bien. Empecé y me está mirando como un buitre, parado detrás de mí, fuera de mi hombro. Soy como "Amigo, WTF: ¿por qué no vas y haces algo mientras termino esto?"
Es como: "No, estoy esperando aquí hasta que termines". Esto es síncrono.
Ejecución asíncrona
El jefe me dice que lo haga, y en lugar de esperar allí mismo mi trabajo, el jefe se va y hace otras tareas. Cuando termino mi trabajo, simplemente me dirijo a mi jefe y le digo: "¡HECHO!" Esta es la ejecución asíncrona.
¡Es realmente tan simple! Espero eso ayude.
(Sigue mi consejo: NUNCA trabaje con el jefe detrás de usted).
Una definición diferente en inglés de sincronizar está Here
Coordinar; combinar.
Creo que esa es una mejor definición que "Pasar al mismo tiempo". Esa también es una definición, pero no creo que sea la que se ajuste a la forma en que se usa en Informática.
Por lo tanto, una tarea asíncrona no se coordina con otras tareas, mientras que una tarea síncrona se coordina con otras tareas, por lo que una termina antes de que comience otra.
Cómo se logra eso es una pregunta diferente.
Una operación síncrona hace su trabajo antes de regresar a la persona que llama.
Una operación asíncrona realiza (la mayoría o la totalidad) de su trabajo después de regresar a la persona que llama.
Sincrónico : cuando una tarea se ejecuta de forma síncrona, espera a que se complete una tarea antes de pasar a otra tarea. Una tarea depende del final de otra.
Asíncrono : cuando una tarea se ejecuta de forma asíncrona, puede cambiar directamente a otra tarea antes de que se haya completado la anterior. Una tarea no depende de la otra.
En la programación, las tareas se ejecutan en un " hilo ". Es necesario comprender que se pueden crear varios subprocesos para tareas con el fin de evitar el apilamiento en una sola cola.
Dicho esto, el concepto de síncrono y asíncrono no tiene mucho que ver con los hilos, la razón por la que lo menciono es que es raro ver tareas que se ejecutan de forma asíncrona en un solo hilo (aunque técnicamente es posible).
La ejecución síncrona significa que la ejecución ocurre en una sola serie. A->B->C->D
Si está llamando a esas rutinas, A
se ejecutará, luego terminará, luego B
comenzará, luego terminará, C
comenzará, etc.
Con la ejecución asíncrona , comienza una rutina y la deja ejecutarse en segundo plano mientras comienza la siguiente, luego, en algún momento, diga "espere a que esto termine". Es más como
Inicio A->B->C->D->
Espere a que A
termine
La ventaja es que puede ejecutar B
, C
y D
mientras A
aún se está ejecutando (en segundo plano, en un hilo separado), de modo que puede aprovechar mejor sus recursos y tener menos "bloqueos" o "esperas".
Modelo de programación síncrona : un hilo se asigna a una tarea y comienza a trabajar en ella. Una vez que la tarea se completa, está disponible para la siguiente tarea. En este modelo, no puede dejar la tarea en ejecución a la mitad para asumir otra tarea. Vamos a discutir cómo funciona este modelo en entornos de subprocesos múltiples y múltiples.
Un solo hilo: si tenemos un par de tareas en las que trabajar y el sistema actual proporciona solo un solo hilo, entonces las tareas se asignan al hilo uno por uno. Puede representarse gráficamente como
Múltiples hilos: en este entorno, solíamos tener varios hilos que pueden realizar estas tareas y comenzar a trabajar en eso. Significa que tenemos un conjunto de subprocesos (también se pueden crear nuevos subprocesos según el requisito y los recursos disponibles) y un montón de tareas. Así que estos hilos pueden trabajar en estos como
Modelo de programación asíncrono : al contrario que en el modelo de programación síncrono, aquí un subproceso una vez comienza a ejecutar una tarea que puede mantener a la mitad, guarda el estado actual y comienza a ejecutar otra tarea.
Sincrónico / Asíncrono NO TIENE NADA QUE HACER CON MULTIHILO.
Sincrónico, o Sincronizado significa "conectado" o "dependiente" de alguna manera. En otras palabras, dos tareas síncronas deben estar conscientes una de otra, y una tarea debe ejecutarse de alguna manera que dependa de la otra, como esperar a que comience la otra tarea.
Los medios asíncronos son totalmente independientes y ninguno de los dos debe considerar al otro de ninguna manera, ya sea en la iniciación o en la ejecución.
Sincrónico (un hilo):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Sincrónico (multihilo):
thread A -> |<---A---->|
/
thread B ------------> ->|<----B---------->|
/
thread C ----------------------------------> ->|<------C----->|
Asíncrono (un hilo):
A-Start ------------------------------------------ A-End
| B-Start -----------------------------------------|--- B-End
| | C-Start ------------------- C-End | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Asíncrono (multihilo):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
- Puntos de inicio y final de las tareas A, B, C representados por
<
,>
caracteres. - Tiempos de CPU representados por barras verticales
|
Técnicamente, el concepto de síncrono / asíncrono realmente no tiene nada que ver con los hilos . Aunque, en general, es inusual encontrar tareas asíncronas ejecutándose en el mismo subproceso, es posible (consulte los ejemplos a continuación) y es común encontrar dos o más tareas que se ejecutan de forma síncrona en subprocesos separados ... No, el concepto síncrono / asíncrono tiene que ver únicamente con la posibilidad de iniciar o no una segunda tarea o una tarea posterior antes de que la otra (primera) tarea se haya completado, o si debe esperar. Eso es todo. En qué hilo (o hilos), o procesos, o CPU, o de hecho, en qué hardware, las tareas [s] se ejecutan no es relevante. De hecho, para resaltar este punto he editado los gráficos para mostrar esto.
EJEMPLO ASINCRONO. Al resolver muchos problemas de ingeniería, el software está diseñado para dividir el problema general en múltiples tareas individuales y luego ejecutarlas de forma asíncrona. Invertir una matriz, o un problema de análisis de elementos finitos, son buenos ejemplos. En computación, ordenar una lista es un ejemplo. La rutina de clasificación rápida, por ejemplo, divide la lista en dos listas y ordena cada una de ellas llamándose a sí misma de forma recursiva. En los dos ejemplos anteriores, las dos tareas pueden (y con frecuencia se ejecutaron) de forma asíncrona. No necesitan estar en hilos separados. Incluso una máquina con una CPU, y solo un hilo de ejecución puede codificarse para iniciar el procesamiento de una segunda tarea antes de que se haya completado una primera. El único criterio es que los resultados de una tarea no son necesarios como entradas para la otra tarea . Siempre que los tiempos de inicio y finalización de las tareas se superpongan (es posible solo si la salida de ninguno de los dos se necesita como entradas para el otro), se ejecutan de forma asíncrona, independientemente de la cantidad de subprocesos en uso.
Ejemplo sincrónico. Cualquier proceso que consiste en múltiples tareas en las que las tareas deben ejecutarse en secuencia, pero una debe ejecutarse en otra máquina (obtener y / o actualizar datos, obtener una cotización de acciones de un servicio financiero, etc.). Si está en una máquina separada, está en un hilo separado, ya sea síncrono o asíncrono.