¿Cuál es la diferencia entre ejecución asíncrona y síncrona?
¿Cuál es la diferencia entre ejecución asíncrona y síncrona?
Respuestas:
Cuando ejecutas algo sincrónicamente, esperas a que termine antes de pasar a otra tarea. Cuando ejecuta algo de forma asincrónica, 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 un subproceso a un subproceso ("segmento") de tiempo de procesador antes de cambiar a otro subproceso para darle el turno de hacer algo de trabajo. En esencia (perdón por el juego de palabras), un procesador puede simplemente ejecutar un comando, no tiene el concepto de hacer dos cosas al mismo tiempo. El sistema operativo simula esto mediante la asignación de segmentos de tiempo a diferentes subprocesos.
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, 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 puede continuar en su código y hacer otras cosas.
La programación asincrónica 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!
Sincrónico / Asincrónico NO TIENE NADA QUE HACER CON HILOS MÚLTIPLES.
Sincrónico o Sincronizado significa "conectado" o "dependiente" de alguna manera. En otras palabras, dos tareas sincrónicas deben ser conscientes una de la otra, y una tarea debe ejecutarse de alguna manera que dependa de la otra, como esperar a comenzar hasta que la otra tarea se haya completado.
Asíncrono significa que son totalmente independientes y ninguno 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 (multiproceso):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
caracteres.|
Técnicamente, el concepto de síncrono / asíncrono realmente no tiene nada que ver con hilos . Aunque, en general, es inusual encontrar tareas asincrónicas que se ejecutan en el mismo hilo, es posible (ver ejemplos a continuación) y es común encontrar dos o más tareas ejecutándose sincrónicamente en hilos separados ... No, el concepto de síncrono / asíncrono tiene que ver únicamente con si se puede iniciar una segunda tarea o no antes de que se complete la otra (primera) tarea, o si debe esperar. Eso es todo. Qué hilo (o hilos), o procesos, o CPU, o de hecho, en qué hardware, las tareas se ejecutan no es relevante. De hecho, para aclarar esto, he editado los gráficos para mostrar esto.
EJEMPLO ASINCRÓNICO:
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 asincrónica. Invertir una matriz, o un problema de análisis de elementos finitos, son buenos ejemplos. En informática, ordenar una lista es un ejemplo. La rutina de clasificación rápida, por ejemplo, divide la lista en dos listas y realiza una clasificación rápida en cada una de ellas, llamándose a sí misma (clasificación rápida) de forma recursiva. En los dos ejemplos anteriores, las dos tareas pueden (y con frecuencia fueron) ejecutadas de forma asincrónica. 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 complete la primera. El único criterio es que los resultados de una tarea no son necesarios como entradas para la otra tarea.. Mientras los tiempos de inicio y finalización de las tareas se superpongan (solo es posible si la salida de ninguno de ellos es necesaria como entradas para el otro), se ejecutarán de forma asincrónica, sin importar cuántos hilos estén en uso.
EJEMPLO SINCRÓNICO:
Cualquier proceso que consta de múltiples tareas donde 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 del servicio financiero, etc.). Si está en una máquina separada, está en un hilo separado, ya sea síncrono o asíncrono.
En términos más simples:
SINCRÓNICO
Estás en una cola para obtener un boleto de cine. No puede obtener uno hasta que todos los que están frente a usted obtengan uno, y lo mismo se aplica a las personas que hacen cola detrás de usted.
ASINCRÓNICO
Estás en un restaurante con muchas otras personas. Pides tu 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. Las personas recibirán su comida tan pronto como se cocine.
Ejecución Sincrónica
Mi jefe es un hombre ocupado. Me dice que escriba el código. Yo le digo: bien. Comienzo y él me mira como un buitre, parado detrás de mí, fuera de mi hombro. Estoy como "Amigo, WTF: ¿por qué no vas y haces algo mientras termino esto?"
él dice: "No, estoy esperando aquí hasta que termines". Esto es sincrónico.
Ejecución asincrónica
El jefe me dice que lo haga, y en lugar de esperar allí mi trabajo, el jefe se va y hace otras tareas. Cuando termino mi trabajo, simplemente le informo a mi jefe y le digo: "¡Estoy HECHO!" Esta es la ejecución asincrónica.
(Sigue mi consejo: NUNCA trabajes con el jefe detrás de ti).
La ejecución sincrónica significa que la ejecución ocurre en una sola serie. A->B->C->D
. Si está llamando a esas rutinas, A
se ejecutará, luego finalizará, luego B
comenzará, luego finalizará, luego C
comenzará, etc.
Con la ejecución asíncrona , comienza una rutina y deja que se ejecute 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->
Espera a A
que termine
La ventaja es que se puede ejecutar B
, C
y oD
mientras A
aún se está ejecutando (en segundo plano, en un hilo separado), por lo que puede aprovechar mejor sus recursos y tener menos "bloqueos" o "esperas".
En pocas palabras, la sincronización se refiere a dos o más puntos de inicio y finalización de procesos , NO a sus ejecuciones . En este ejemplo, el punto final del Proceso A está sincronizado con el punto inicial del Proceso B:
SINCRÓNICO | -------- A -------- | | -------- B -------- |
Los procesos asincrónicos, por otro lado, no tienen sus puntos de inicio y finalización sincronizados:
ASINCRÓNICO | -------- A -------- | | -------- B -------- |
Cuando el proceso A se superpone al proceso B, se ejecutan simultáneamente o sincrónica (definición del diccionario), de ahí la confusión.
ACTUALIZACIÓN: Charles Bretana mejoró su respuesta , por lo que esta respuesta ahora es solo una mnemónica simple (potencialmente simplificada).
Sincrónico significa que la persona que llama espera la respuesta o la finalización, asíncrona que la persona que llama continúa y una 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 superará:
Before call
In call
After call
Pero si tuviéramos que hacer algo asíncrono (múltiples formas de hacerlo), entonces el resultado podría ser:
Before call
After call
In call
Porque el método que realiza la llamada asincrónica continuaría 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 hilo, etc.
Creo que esta es una explicación un poco redonda, pero aún así se aclara con el ejemplo de la vida real.
Pequeño ejemplo:
Digamos que reproducir un audio implica tres pasos:
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 independientemente el uno del otro, entonces es asíncrono. es decir. Mientras reproduce el audio 1 (paso 3), si obtiene 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.
Las operaciones de sincronización y asincronización se tratan de ejecutar una nueva tarea en relación con la tarea actual. Dos tareas en una mesa: tarea actual y una nueva tarea
Sincrónico (bloqueo): implica que las tareas se ejecutarán una por una. La siguiente tarea se inicia solo después de que finaliza su tarea anterior. Task 2
no se inicia hasta que Task 1
se termina
Asíncrono (sin bloqueo): implica que la tarea devuelve el control inmediatamente con la promesa de ejecutar un código y notificar el resultado más tarde (por ejemplo, devolución de llamada, función). Task 2
se ejecuta incluso si Task 1
no está terminado
Así que responda sobre sincronización y asíncrono: en iOS , en Android
Simplemente dijo que la ejecución asincrónica 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 termine de descargarse. Esto puede hacer que su aplicación no responda a ninguna entrada del usuario.
En su lugar, puede descargar el archivo en segundo plano utilizando un método asincrónico. En este caso, la función de descarga vuelve inmediatamente y la ejecución del programa continúa normalmente. Todas las operaciones de descarga se realizan en segundo plano y su programa será notificado cuando haya terminado.
Como un ejemplo realmente simple,
SINCRÓNICO
Imagine a 3 estudiantes de la escuela instruidos para correr una carrera de relevos en una carretera.
El primer estudiante corre su distancia dada, se detiene y pasa el testigo al segundo. Nadie más ha comenzado a correr.
1------>
2.
3.
Cuando la segunda estudiante recupera el bastón, comienza a correr su distancia dada.
1.
2------>
3.
La segunda estudiante se desató el cordón del zapato. Ahora se ha detenido y atado de nuevo. Debido a esto, el tiempo final del segundo se ha extendido y el tiempo de inicio del tercero se ha retrasado.
1.
--2.--->
3.
Este patrón continúa hasta que el 3º recupera el testigo del 2º y termina la carrera.
ASINCRÓNICO
Imagínese 10 personas al azar caminando por el mismo camino. No están en una cola, por supuesto, simplemente caminan al azar en diferentes lugares en el camino en diferentes ritmos.
El cordón de la segunda persona se desató. Se detuvo para atarlo de nuevo.
Pero nadie está esperando que ella lo ató. Todos los demás siguen caminando de la misma manera que lo hicieron antes, en el mismo ritmo que ellos.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Creé un gif para explicar esto, espero ser útil: mira, la línea 3 es asíncrona y otras son sincrónicas. todas las líneas antes de la línea 3 deben esperar hasta que la línea termine su trabajo, pero debido a que la línea 3 es asíncrona, la siguiente línea (línea 4), no espere a la línea 3, pero la línea 5 debe esperar a que la línea 4 termine su trabajo, y la línea 6 debería esperar a la línea 5 y 7 a la 6, porque la línea 4,5,6,7 no es asíncrona.
Al ejecutar una secuencia como: a> b> c> d>, si tenemos una falla en el medio de la ejecución como:
a
b
c
fail
Luego reiniciamos 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.
Estás confundiendo Sincrónico con Paralelo vs Serie. Sincrónico significa todo al mismo tiempo. Medios sincronizados relacionados entre sí que pueden significar en serie o en un intervalo fijo. Mientras el programa está haciendo todo, se ejecuta en serie. Obtenga un diccionario ... es por eso que tenemos té dulce. Tienes té o té endulzado.
Sincrónico básicamente significa que solo 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.
Use un ejemplo de instrucciones para preparar un desayuno.
Si tienes experiencia cocinando, ejecutarías esas instrucciones de forma asincrónica. comenzaría a calentar la sartén para huevos, luego comenzaría el tocino. Pusiste el pan en la tostadora y luego comenzaste los huevos. En cada paso del proceso, comenzaría una tarea y luego centraría su atención en las tareas que están listas para su atención.
Preparar el desayuno es un buen ejemplo de trabajo asincrónico que no es paralelo. Una persona (o hilo) puede manejar todas estas tareas. Continuando con la analogía del desayuno, una persona puede preparar el desayuno de forma asincrónica iniciando la siguiente tarea antes de que se complete la primera. La cocción progresa ya sea que alguien la esté mirando o no. Tan pronto como comience a calentar la sartén para los huevos, puede comenzar a freír el tocino. Una vez que comience el tocino, puede poner el pan en la tostadora.
Para un algoritmo paralelo, necesitaría múltiples cocineros (o hilos). Uno haría los huevos, uno el tocino, etc. Cada uno se centraría en esa única tarea. Cada cocinero (o hilo) se bloquearía sincrónicamente a la espera de que el tocino esté listo para voltearse, o que la tostada estalle.
Referencia de conceptos de programación asincrónica
Una operación sincrónica hace su trabajo antes de regresar a la persona que llama.
Una operación asincrónica realiza (la mayoría o la totalidad) su trabajo después de regresar a la persona que llama.
En lo que respecta a la definición " al mismo tiempo " de ejecución sincrónica (que a veces es confusa), aquí hay una buena manera de entenderla:
Ejecución síncrona : todas las tareas dentro de un bloque de código se ejecutan todas al mismo tiempo.
Ejecución asincrónica : no todas las tareas dentro de un bloque de código se ejecutan al mismo tiempo.
Creo que una buena forma de pensar es en una carrera de relevos clásica.
Sincrónico : procesa como miembros del mismo equipo, no se ejecutarán hasta que reciban el testigo (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 miembros de diferentes equipos en la misma pista de carrera de relevos, correrán y se detendrán, asincrónicos entre sí, pero dentro de la misma carrera (ejecución general del programa).
¿Tiene sentido?
Una definición diferente en inglés de Sincronizar está aquí
Coordinar; combinar.
Creo que es una mejor definición que "Suceder 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 asincrónica no se coordina con otras tareas, mientras que una tarea sincrónica se coordina con otras tareas, por lo que una finaliza antes de que comience otra.
Cómo se logra eso es una pregunta diferente.
Sincrónico significa que se ejecutará la ejecución de forma de cola una por una tarea. Suponga que solo hay un vehículo que debe compartirse entre amigos para llegar a su destino, uno por uno será compartido.
En caso asíncrono, cada amigo puede alquilar un vehículo y llegar a su destino.
Sí, sincrónico significa al mismo tiempo, literalmente, significa trabajar todos juntos. múltiples humanos / objetos en el mundo pueden hacer varias cosas al mismo tiempo, pero si miramos a la computadora, dice sincrónico significa que los procesos trabajan juntos, lo que significa que los procesos dependen del retorno de los demás y es por eso que se ejecutan uno 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 subprocesos múltiples), pero funcionan de forma independiente.