Pregunta Ejecución asíncrona vs sincrónica, ¿qué significa realmente?


¿Cuál es la diferencia entre la ejecución asíncrona y la sincrónica?


869
2018-04-14 15:39


origen


Respuestas:


Cuando ejecuta algo sincrónicamente, espera a que termine antes de pasar a otra tarea. Cuando ejecuta algo de manera asincrónica, puede pasar a otra tarea antes de que termine.

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 hilos y asignar un hilo por pedazo ("slice") de tiempo del procesador antes de cambiar a otro hilo para darle un giro para hacer algo de trabajo. En su núcleo (perdón por el juego de palabras), un procesador puede simplemente 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 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 hilo en el primer procesador, luego asignar el mismo bloque de tiempo a otro hilo 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 puedes hacerlas al mismo tiempo. Hay numerosos artículos y libros sobre el tema; ¡echar un vistazo!


1360
2018-04-14 15:43



Sincrónico / asincrónico NO TIENE NADA QUE VER CON MULTI-ROSCADO.

Sincrónico, o Sincronizado significa "conectado" o "dependiente" de alguna manera. En otras palabras, dos tareas síncronas deben conocerse mutuamente, y una tarea debe ejecutarse de alguna manera que dependa de la otra, como esperar para comenzar hasta que la otra tarea se haya completado.
Asincrónico significa que son totalmente independientes y ninguno debe considerar al otro de ninguna manera, ni en iniciación ni en ejecución.

Sincrónico (un hilo):

1 thread ->   |<---A---->||<----B---------->||<------C----->|

Sincrónico (multiproceso):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

Asincrónico (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-->| 

Asincrónico (multi-Threaded):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • Puntos de inicio y final de las tareas A, B, C representadas por <, > caracteres.
  • Rebanadas de tiempo de CPU representadas por barras verticales |

Técnicamente, el concepto de sincrónico / asíncrono realmente no tiene nada que ver con los hilos. Aunque, en general, es inusual encontrar tareas asíncronas que se ejecutan en el mismo subproceso, es posible (vea más abajo ejemplos) y es común para encontrar dos o más tareas ejecutándose sincrónicamente en separar hilos ... No, el concepto de sincrónico / asíncrono tiene que ver solamente con si se puede iniciar una segunda tarea o una posterior antes de que la otra (primera) tarea se haya completado, o si debe esperar. Eso es todo. Qué hilo (o subprocesos), o procesos, o CPU, o de hecho, en qué hardware, se ejecutan las tareas no es relevante. De hecho, para hacer este punto, he editado los gráficos para mostrar esto.

EJEMPLO ASÍNCRONO. 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 ordenación rápida, por ejemplo, divide la lista en dos listas y ordena cada una de ellas llamándose recursivamente. En los dos ejemplos anteriores, las dos tareas pueden (y a menudo se ejecutan) 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 complete 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, (posible solo si el resultado de ninguno es necesario como entradas para el otro), se están ejecutando de forma asíncrona, sin importar cuántos subprocesos estén en uso.

EJEMPLO SÍNCRONO. Cualquier proceso que consta de múltiples tareas donde las tareas deben ejecutarse en secuencia, pero una debe ejecutarse en otra máquina (recuperar y / o actualizar datos, obtener una cotización de acciones de un servicio financiero, etc.). Si está en una máquina separada, está en una hebra separada, ya sea sincrónica o asíncrona.


921
2018-04-14 15:53



En términos más simples:

SINCRÓNICO

Usted está en una cola para obtener un boleto de cine. No puede obtener uno hasta que todos los que están frente a usted lo hagan, y lo mismo se aplica a las personas que están detrás de usted.

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 le cocinen y le sirvan la comida antes de que puedan ordenarla. En el restaurante de la cocina, los trabajadores están continuamente cocinando, sirviendo y atendiendo pedidos. La gente recibirá su comida servida tan pronto como esté cocinada.


519
2017-11-07 15:43



Trataré de explicarlo de la manera más simple posible para que (con suerte) recuerdes:

Ejecución sincrónica

Mi jefe es un hombre ocupado Él me dice que escriba el código. Yo le digo: Bien. Empiezo y me mira 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?"

él dice: "No, estoy esperando aquí hasta que termine ". Esto es sincrónico.

Ejecución asincrónica

El jefe me dice que lo haga, y en lugar de esperar allí por mi trabajo, el jefe se va y hace otras tareas. Cuando termino mi trabajo simplemente le informo a mi jefe y le digo: "¡HE TERMINADO!" Esta es la ejecución asincrónica.

¡Es así de simple! Espero eso ayude.

(Siga mi consejo: NUNCA trabaje con el jefe detrás de usted).


247
2018-06-08 11:13



Ejecución sincrónica significa que la ejecución ocurre en una sola serie. A->B->C->D. Si llamas a esas rutinas, A correrá, luego terminará, luego B comenzará, luego terminará, luego Ccomenzará, etc.

Con Ejecución asincrónica, comienza una rutina, y deja que se ejecute en segundo plano mientras comienza la siguiente, luego, en algún momento, diga "esperar a que termine". Es más como:

comienzo  A->B->C->D->Espere para A para terminar

La ventaja es que puedes ejecutar B, Cy yo D mientras A todavía se está ejecutando (en segundo plano, en un hilo separado), por lo que puede aprovechar mejor sus recursos y tener menos "bloqueos" o "esperas".


73
2018-04-14 15:43



Sincrónico significa que la persona que llama espera la respuesta o la finalización, asincrónico de que la persona que llama continúa y la respuesta viene 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 producirá:

Before call
In call
After call

Pero si tuviéramos que hacer algo asíncrono (múltiples formas de hacerlo), entonces la salida podría volverse:

Before call
After call
In call

Porque el método que realiza la llamada asíncrona continuaría inmediatamente con la siguiente línea de código. Digo "podría", porque el orden de ejecución no puede garantizarse con operaciones de asincronización. También podría ejecutarse como el original, dependiendo de los tiempos del hilo, etc.


46
2018-04-14 15:47



Creo que esto es una explicación un poco redonda, pero aún así aclara el uso de ejemplos de la vida real.

Pequeño ejemplo:

Digamos que reproducir un audio implica tres pasos:

  1. Obteniendo la canción comprimida del disco duro
  2. Descomprime el audio.
  3. Reproduzca el audio sin comprimir.

Si su reproductor de audio hace el paso 1,2,3 secuencialmente para cada canción, entonces es sincrónico. Tendrás que esperar un tiempo para escuchar la canción hasta que la canción realmente sea captada y descomprimida.

Si su reproductor de audio hace el paso 1,2,3 independientemente el uno del otro, entonces es asincrónico. es decir. Mientras reproduce el audio 1 (paso 3), si extrae el audio 3 del disco duro en paralelo (paso 1) y descomprime el audio 2 en paralelo. (paso 2 ) Usted terminará escuchando la canción sin esperar mucho para buscarla y descomprimirla.


30
2018-04-14 16:27