El significado de asíncrono vs síncrono [cerrado]


46

¿Cuál es el significado de las palabras asíncrono y sincrónico en informática?

Si googleas el significado de las palabras obtendrás lo siguiente:

Pero parece que se usan para transmitir el significado opuesto en programación o informática:

El atributo HTML async significa que el script se ejecutará tan pronto como se descargue, incluso si el HTML todavía se está analizando o descargando, lo que significa que ambos procesos, el script y el HTML, existen y ocurren al mismo tiempo para mí.

¿Se utilizan estos términos para transmitir el significado opuesto en informática o me estoy perdiendo el punto?


47
Me resulta fácil saberlo: si no entiendo cómo funciona el código y si los errores desaparecen repentinamente cuando los estoy buscando, el código probablemente sea asíncrono. :)
Eric Duminil

44
La triste verdad es que, en el ámbito de la programación, con el tiempo estas palabras han llegado a significar lo contrario de lo que significan. Puede haber razones históricas para sus significados actuales, pero no hay una buena justificación.
El secreto de Solomonoff el

3
Al mismo tiempo que qué , es la clave :)
Lightness compite con Monica el

55
La operación real no (necesariamente) ocurre al mismo tiempo que se invoca la función frente a la operación que ocurre al mismo tiempo que se invoca la función ... ¿no me parece al revés? Si describo una función como asincrónica, estoy diciendo que no se garantiza que suceda al mismo tiempo que lo llamas.
Affe

2
"secuencial" y "no secuencial" pueden haber sido mejores opciones semánticamente, pero ese barco ya ha navegado.
Jared Smith

Respuestas:


47

Me gustaría darle una respuesta que esté directamente relacionada con las definiciones que encontró. Cuando una tarea T1 inicia una segunda tarea T2, puede suceder de la siguiente manera:

Sincrónico: existente o presente al mismo tiempo.

Por lo tanto, se garantiza que T2 se iniciará y ejecutará dentro del segmento de tiempo de T1 . T1 "espera" el final de T2 y puede continuar procesando después. En este sentido, T1 y T2 ocurren "al mismo tiempo" (no "en paralelo", sino en un intervalo de tiempo contiguo).

Asíncrono: no existe o ocurre al mismo tiempo.

Entonces el tiempo de ejecución de T2 ahora no está relacionado con T1. Puede ejecutarse en paralelo, puede ocurrir un segundo, un minuto o varias horas más tarde, y T2 aún puede ejecutarse cuando T1 ha finalizado (por lo tanto, para procesar un resultado de T2, se puede requerir una nueva tarea T3). En este sentido, T1 y T2 no están "ocurriendo al mismo tiempo (intervalo)".

Por supuesto, estoy de acuerdo, las definiciones literales parecen ser ambiguas al ver que las operaciones asincrónicas hoy en día a menudo se usan para crear ejecuciones paralelas.


44
Es una pena que tenga tantos votos positivos, porque creo que es incorrecto. Los métodos síncronos se ejecutan uno tras otro, porque el segundo método debe esperar a que se complete el primer método (de bloqueo). Esos dos métodos definitivamente no se ejecutan al mismo tiempo.
Robert Harvey

66
No, no creo que lo haya hecho. Sincronía y simultaneidad no son lo mismo.
Robert Harvey

1
Estoy dispuesto a afirmar que las definiciones de diccionario no son de mucha utilidad para los desarrolladores de software. Probablemente no sea útil intentar asignar las definiciones del diccionario a los términos técnicos que utilizamos.
Robert Harvey

1
En cualquier caso, su edición mejora las cosas, pero las palabras "existentes o que ocurren al mismo tiempo" confunden sus descripciones. Los métodos sincrónicos no se ejecutan "al mismo tiempo"; se ejecutan en una secuencia ordenada , que es lo que los hace sincrónicos.
Robert Harvey

1
@RobertHarvey Las definiciones del diccionario funcionan perfectamente bien si usa la perspectiva correcta. Todos ustedes están obsesionados con el tiempo de ejecución. Las instrucciones tienen una vida útil fuera de cuando se ejecutan. Las instrucciones secuenciales se mueven sincrónicamente de la misma manera que las balas en un revolver se mueven sincrónicamente. Del mismo modo, las instrucciones pueden moverse sincrónicamente a través de las tuberías de instrucciones. Deja de obsesionarte con la perspectiva de la ejecución. Muchas instrucciones les pasan a las instrucciones antes de que se ejecuten.
candied_orange

20

Creo que la mejor forma de entenderlo es la siguiente:

  • Sincrónico: sabemos cuándo sucederá (sucede cuando termina este otro código).
  • Asíncrono: no sabemos cuándo sucederá.

Nota: si bien podemos programar el código para que se ejecute a una hora determinada, en la práctica no sabemos cuándo sucederá, ya que puede retrasarse, incluso ignorando el desorden con el reloj del sistema, porque el sistema está ocupado haciendo otra cosa. Además, incluso si tuviéramos la garantía de que sucederá exactamente a una hora determinada, no estamos seguros de dónde estaría la ejecución de nuestro programa en ese momento. Entonces, no, el código programado para la hora del reloj no es síncrono.


Tenga en cuenta que en el desarrollo de software diremos, por ejemplo, que una tarea es asíncrona como algo sobre la tarea aislada. Sin embargo, si desea definirlo en términos de ocurrir al mismo tiempo o no, debe tener al menos algo más para comparar la tarea.

Muchas plataformas pueden hacer tanto el paralelismo como el cambio de tareas, algunas tienen un paralelismo limitado, algunas no pueden hacer el paralelismo en absoluto y solo dependen del cambio de tareas ... Además, algunas plataformas no pueden interrumpir una tarea y deben completarlas antes de ejecutar una diferente. ... Las tareas asincrónicas son una abstracción sobre todo eso, de modo que el sistema puede decidir cómo ejecutar las tareas para la plataforma dada sin que el desarrollador se preocupe por ello (demasiado).

También vale la pena señalar que podemos conceptualizar, y generalmente abstraemos, obtener entradas externas como una tarea asincrónica. Por ejemplo: obtener texto de la entrada del usuario. No sabemos cuándo escribirá el usuario. Esto también se aplica a la lectura del almacenamiento permanente, la obtención de datos a través de la red o cualquier otro sistema externo.


Por cierto, a pesar de que algunas cosas son fundamentalmente asíncronas, generalmente podemos pretender que no lo son. Hacemos eso haciendo que el software bloquee la ejecución actual, y no haga nada más, hasta que se complete. Es decir, podemos tomar algo asíncrono y envolverlo en una API síncrona.

Una API asincrónica le permitirá continuar la ejecución a pesar de que la operación solicitada no se complete, una sincrónica no. Y a partir de ahí se obtiene la idea asincrónica, en el software, significa que ocurre al mismo tiempo (concurrente).

Vale la pena señalar que asíncrono no implica concurrente. En algunos casos, la plataforma solo puede ejecutar la tarea asincrónica después de que se haya completado la tarea actual. Eso sería secuencial (aunque el orden de ejecución de la tarea asincrónica no está necesariamente garantizado), no sería concurrente (no hay superposición en los períodos de ejecución), pero sería asincrónico.

Ah, por cierto, en algunas plataformas, el sistema puede decidir en línea la tarea asincrónica y, por lo tanto, ejecutarla allí mismo como una operación sincrónica (suponiendo que pueda, eso no es viable para todas las tareas).

Nuevamente, asíncrono solo significa que no sabes cuándo sucederá.


También te puede interesar ¿ La diferencia entre ejecución “concurrente” y “paralela”? .


Exactamente. La descripción encontrada por el OP suena mucho más sobre paralelismo que sincronicidad (si eso es una palabra ...). asynch vs synch se trata de cuándo comienza la acción (ahora mismo cuando lo llamo, o más tarde cuando el planificador decide) mientras que paralelo significa "sí están sucediendo al mismo tiempo" vs secuencial.
Giacomo Alzetta

1
@GiacomoAlzetta Creo que la palabra es sincronismo. También encontré estas palabras similares: sincronización, sincronía y sincronicidad. Probablemente valga su propia pregunta.
Theraot

12

Asíncrono: no existe o ocurre al mismo tiempo.

Sincrónico: existente o presente al mismo tiempo.

El atributo async significa que el script se ejecutará tan pronto como se descargue, incluso si el html aún se está analizando, lo que significa que ambos procesos existen al mismo tiempo para mí.

¡Esto es realmente confuso!

Considere en cambio los significados de sincronizado y no sincronizado . Dos cosas se sincronizan si el tiempo de una depende de la otra, y no sincronizadas si sus tiempos no están relacionados.

En su flujo de trabajo asincrónico de ejemplo, tenemos dos cosas que suceden: ejecución de script y análisis html. Estas dos cosas no están sincronizadas ; el tiempo de la operación de ejecución y el tiempo de la operación de análisis no dependen el uno del otro. Si hiciéramos el flujo de trabajo sincrónico , entonces las operaciones se sincronizarían . Digamos, la ejecución no comienza hasta que el análisis definitivamente haya finalizado.

Pero es importante darse cuenta de que en realidad hay tres posibilidades aquí:

  • la ejecución y el análisis son realmente no sincronizados; ambos pueden suceder en cualquier momento y en cualquier orden, lo que sea más eficiente.
  • la ejecución y el análisis están sincronizados; digamos, la CPU no hace nada mientras espera que se complete la E / S.
  • la ejecución y el análisis están sincronizados, pero mientras esperamos que se complete la E / S, la CPU puede realizar otro trabajo y luego volver y realizar el análisis una vez que se complete la descarga .

Una vez que comprenda eso, el propósito de los flujos de trabajo asíncronos en los lenguajes de programación populares se vuelve más claro:

  • Los flujos de trabajo asincrónicos nos ayudan a implementar operaciones de alta latencia de manera eficiente porque no estamos obligados a ordenar cosas no relacionadas a tiempo. Si el análisis es de alta latencia y de E / S, y la ejecución del script es de alta latencia y de CPU, podemos obtener una ganancia al desincronizar total o parcialmente esas operaciones.

  • El awaitoperador en lenguajes como C # es la operación de pedido en flujos de trabajo asíncronos. Una espera es una espera asincrónica ; se trata de un punto en el que expresamos una relación de orden entre dos partes de un flujo de trabajo asíncrono, y decimos que no es un "sucede antes de que" la relación entre el código antes de la esperan con el código después de la esperan. Así es como implementamos la tercera opción .

Si eso es demasiado abstracto, piense en algunos ejemplos del mundo real. Cuando envía una carta, una operación de E / S de alta latencia, aún puede hacer un trabajo intensivo de CPU, por ejemplo, tarea de matemáticas, mientras espera recibir una respuesta a su carta. Las operaciones de hacer su tarea de matemáticas y leer su correo no están sincronizadas.

Pero suponga que ahora envía una carta y la respuesta contiene un número que necesita para hacer sus impuestos. Ahora no puede hacer el trabajo de la CPU, calculando sus impuestos, hasta que se complete la operación de E / S. Pero aún puede cortar el césped mientras espera . Ese es un flujo de trabajo asincrónico que ha expresado una relación de tiempo entre sus partes.


6

Soy ingeniero eléctrico, y tratamos con circuitos síncronos vs asíncronos en circuitos lógicos (puertas lógicas).

Digamos que tiene una compuerta AND (o cualquier compuerta), que tiene dos entradas y una salida.

Si es asíncrono, actualizará su salida en el momento en que cualquiera de las entradas cambie de tal manera que la salida cambie. Así es como funcionó su ejemplo: el programa que mencionó.

Sin embargo, si esa puerta también tiene un reloj (por ejemplo, una onda cuadrada de 1 segundo) adjunta, donde se actualiza al ritmo de cada segundo, a medida que la onda cuadrada pasa de baja a alta, es sincrónica. Está vinculado a la frecuencia del reloj. Entonces es sincrónico. Podrías conectar ese reloj a muchos circuitos, y operarían en ritmo entre sí, sincronizados. Si su programa solo verifica si se leyó para ejecutarse cada segundo, también se sincronizaría.


1
Como puerto serie asíncrono / síncrono.
jiwopene

2

Imagina dos satélites orbitando la Tierra.

  • El satélite A tiene un período de rotación alrededor de la Tierra de tal manera que por cada rotación completa del planeta, el satélite ha dado la vuelta a la Tierra más o menos de una vez .
  • El satélite B tiene un período de rotación alrededor de la Tierra de tal manera que por cada rotación completa del planeta, el satélite ha dado la vuelta a la Tierra exactamente una vez .

El satélite B en el ejemplo anterior está en órbita geosíncrona como se define por

teniendo un período de rotación sincrónico con el de la rotación de la tierra.

No se argumenta que el satélite A es geosíncrono simplemente porque "existe u ocurre [s] al mismo tiempo" que el planeta. De hecho, el satélite B en sí mismo tampoco es lo que es relevante; lo que es relevante es el período de rotación que se sincroniza con el período de rotación con el de la Tierra. No se trata de la existencia simultánea de los objetos; Se trata de la relación entre los objetos. Mantén este pensamiento.

Supongamos que le digo que dos hilos en un sistema se están ejecutando al mismo tiempo. El subproceso A (TA) está recuperando datos para el proceso A y el subproceso B (TB) está recuperando datos para el proceso B. Le pregunto: "¿Son asincrónicos el TA y la TB?". Su respuesta sería: "¿Cómo podría saberlo? Tendría que ver el código que los invocó en sus respectivos procesos". A lo que respondería en mi intento de ser engañoso: "Pero les digo que la TA y la TB definitivamente se están ejecutando al mismo tiempo".

Y usted, siendo un individuo bastante inteligente, respondería: "Una vez más, pueden estar ejecutándose simultáneamente, pero no tengo idea de si se están ejecutando de forma asincrónica con respecto a sus respectivos procesos que los invocaron. TA y TB se ejecutan de forma asincrónica entre sí realmente hacen no tiene sentido porque no fueron generados por el mismo proceso ".

Entonces, ahora deberíamos estar adquiriendo cierta intuición de que la existencia de una relación es lo que es relevante aquí, no solo la existencia de estos dos hilos. Cuando un método se ejecuta de forma asíncrona, lo que estamos diciendo es que la ejecución de ese método " NO necesita existir ni ocurrir al mismo tiempo" que la ejecución del método que lo invocó. Tome el siguiente ejemplo:

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

De nuestra discusión sobre satélites anterior, "No se trata de la existencia simultánea de los objetos; se trata de la relación entre los objetos". No se trata de la existencia de un método de invocación y el método invocado; Se trata de la existencia de una relación entre la ejecución del invocador y la ejecución del invocado. Si observamos los subprocesos de nuestro sistema y descubrimos que DoThatAsync()se invocó pero no se estaba ejecutando, tal vez está esperando en el programador o en alguna otra E / S, eso no significa necesariamente que el método de invocación Invoker()no se esté ejecutando: hay trabajo que podría estar haciendo. Claro, puede estar en el punto de awaiting DoThatAsync(), pero que no está garantizada. Esto no es cierto para las otras funciones una vez que se han invocado; si se detienen,Invoker()se detiene, no importa qué. Esto esta garantizado. La ejecución entre el Invoker()método síncrono invocado "existe o se produce al mismo tiempo".


Me gusta esto en realidad. En general, es el salvaje oeste de la ejecución arbitraria como "asíncrona" frente a una ruta de ejecución clara definida como "sincrónica"
Cruncher

También creo que esta es la mejor respuesta.
Barmar

2

Ejemplos concretos

Me gustaría agregar algunos ejemplos del mundo real y conectarlos al mundo de la ingeniería de software. Primero, considere algo que espero coincida con su definición intuitiva de "sincrónico": el parpadeo de las luciérnagas , en algunas circunstancias. En segundo lugar, considere la carrera de relevos olímpicos femeninos 4x100 . Tercero, considere ese viejo tropo de las películas militares: "¡Hombres, sincronicen sus relojes!"

Ahora, pensemos en lo que está pasando. Comencemos observando que todas estas cosas son procesos o entidades extendidas en el tiempo . No tiene sentido decir que un cuenco es "sincrónico" y que el rock es "asíncrono". Segundo, se necesitan dos para bailar tango . No se puede decir que "un corredor es sincronización". ¿Sincronizar con qué? Finalmente, para que dos procesos hagan algo al mismo tiempo, a menos que ya tengan exactamente la misma frecuencia y fase, uno o ambos deben esperar .

Análisis

Cuando la definición del diccionario dice que dos entidades sincronizadas "ocurren o existen al mismo tiempo", eso se alinea muy bien con el concepto de la luz de las luciérnagas. Desafortunadamente, decir que la luz está "sincronizada" es una manera descuidada de decir que los procesos de iluminación de la luciérnaga están sincronizados.

Entonces, ¿cómo pueden un montón de luciérnagas, que presumiblemente no tienen Apple SmartWatch y NTP para guiarlos, lograr flashear sus extremos traseros al mismo tiempo? Bueno, es bastante fácil si tienen un medio para establecer un tempo constante y pueden hacer pequeños ajustes. Simplemente parpadean, y si más personas parpadean justo después de ellos, disminuyen la velocidad (aumentan el retraso), mientras que si parpadean más justo antes de ellos, se aceleran (disminuyen el retraso). Entonces pueden usar un proceso de retroalimentación simple para llegar esencialmente al mismo tempo y fase. La observación importante aquí es notar que logran sincronía al esperar el momento adecuado para destellar .

La carrera 4x100 es interesante porque ves ambas formas de sincronización del proceso en acción: los corredores dentro de un equipo están sincronizados, mientras que los corredores en diferentes equipos están "asíncronos". El segundo corredor en el relevo debe esperar hasta que el primer corredor entre en la zona de transferencia . La transferencia es un evento síncrono entre esos dos corredores. Sin embargo, a los corredores en diferentes carriles no les importa lo que está sucediendo en otro carril , y ciertamente no disminuyen la velocidad y hacen sus traspasos sincronizados. Cada carril de corredores es asíncrono uno con respecto al otro. Nuevamente, vemos que la sincronización implica esperar, mientras que la asincronía no.

Finalmente, los soldados en una compañía (pelotón, equipo de bomberos, etc.) deben sincronizar sus relojes para que puedan atacar al enemigo al mismo tiempo . Puede ser que algunos soldados lleguen a sus posiciones antes que otros, o tengan la oportunidad de disparar al enemigo antes. Pero un ataque simultáneo es generalmente más efectivo que un ataque fortuito debido al elemento sorpresa. Entonces, para lograr la sincronía, muchos de los soldados deben esperar el momento señalado para actuar.

Caracteristica que define

¿Por qué este énfasis en esperar? Bueno, es porque esperar es la característica definitoria que distingue los procesos síncronos de los asíncronos. Si tiene dos procesos de los que no sabe nada, debería, por defecto, asumir que son asíncronos. Por ejemplo, un paquete de entrega y una ambulancia conduciendo probablemente no estén sincronizados. Para demostrar que dos procesos están, de hecho, sincronizados, necesita encontrar un momento muy especial en el tiempo: el punto de sincronización .

Un conductor de entrega que deja un paquete y una ambulancia que lleva a alguien al hospital generalmente no comparten ningún punto en el tiempo que identifiquemos como "punto de sincronización". Por otro lado, las luciérnagas que parpadean al unísono tienen un punto de sincronización cada vez que parpadean, los corredores de relevos tienen un punto de sincronización cada vez que entregan el bastón y los soldados tienen un punto de sincronización cuando lanzan su ataque. Si puede identificar uno o más puntos de sincronización, los procesos se sincronizan . Esto debería ser fácil de entender, porque "syn-" es un prefijo griego que significa "con" o "juntos", y "chrono" es la raíz griega para "tiempo". "Sincronizado" significa literalmente "al mismo tiempo",

Límites

Tenga en cuenta que la "sincronización" no se aplica necesariamente a toda la vida útil de uno o ambos procesos. Yo diría que solo se aplica al "tiempo de espera hasta el punto o puntos de sincronización incluidos". Por lo tanto, dos procesos pueden funcionar de forma asíncrona hasta que alcanzan un estado en el que necesitan comunicarse, luego se sincronizan, intercambian información y luego continúan asincrónicamente. Un ejemplo simple es conocer a alguien para tomar un café. Obviamente, la reunión es un punto de sincronización (o muchos, más bien), y el hecho de que dos personas lleguen a ese punto demuestra la sincronía. Sin embargo, no diríamos que debido a que dos personas se reunieron para tomar café, esas dos vidas humanasestán "sincronizados". Puede ser que ese fue el único instante en sus vidas que conocieron, y todo lo demás que hacen es independiente.

Tampoco es el caso que las reuniones incidentales demuestren sincronía. Si dos extraños se cruzan en la calle, el hecho de que se encuentren en un lugar determinado en algún momento no prueba la sincronía. Tampoco el hecho de que una persona esté sentada en un banco esperando el autobús y otra pase por allí. Los procesos solo son sincrónicos cuando se encuentran con un propósito .

Conexión de software

Ahora, pensemos en una tarea fundamental en el software: leer de un archivo. Como probablemente sepa, el almacenamiento masivo suele ser de miles a millones de veces más lento que el caché o la memoria principal. Por esta razón, los sistemas operativos y las bibliotecas de lenguaje de programación generalmente ofrecen operaciones de E / S sincrónicas y asincrónicas. Ahora, incluso si su programa solo tiene un hilo único, debe pensar en el sistema operativo como un "proceso separado" para los propósitos de esta discusión.

Sincronización

Cuando realiza una "lectura de E / S sincrónica", su subproceso debe esperar hasta que los datos estén disponibles, momento en el que continúa. Esto es muy parecido a un corredor de relevos que le entrega el testigo al siguiente corredor, pero imagina un relevo con solo dos corredores recorriendo la pista, y el segundo corredor también pasa al primero.

En este caso, el hilo de su programa y el proceso de E / S del sistema operativo no están "sucediendo (actuando) al mismo tiempo", por lo que parece extraño decir que estos procesos están "sincronizados". ¡Pero esa es la forma incorrecta de verlo! Es como decir: "Los corredores en un equipo de relevos no están corriendo al mismo tiempo, por lo que no están sincronizados". De hecho, ambas afirmaciones están equivocadas! Los corredores en un equipo de relevos hacen y deben ejecutarse al mismo tiempo, pero sólo en un momento muy específico: el hand-off de la batuta. De hecho, ¡es solo este momento especial durante la carrera que nos convence de que los equipos de relevos están sincronizados para empezar! Si consideramos la solicitud y la respuesta de E / S como "el testigo",

Por otro lado, si pensamos en algo como el análisis de elementos finitos en una supercomputadora, vemos que miles de procesos deben funcionar de forma sincronizada para actualizar un estado global masivo. Incluso si algunos de los nodos completan su trabajo durante un paso de tiempo determinado antes que otros, todos deben esperar a que se complete el paso de tiempo porque los resultados se propagan a los vecinos a través del espacio. Este tipo de sincronización es como las luciérnagas: todos los actores realizan el mismo tipo de tarea.

Variedad de proceso

Por esta razón, podemos inventar algunos términos para ayudarnos a ver que están sucediendo tres tipos de cosas: "sincronía homogénea", "sincronía heterogénea" y "sincronía secuencial". Entonces, cuando los actores realizan la misma tarea simultáneamente (FEA, luciérnagas), son "homogéneos". Cuando realizan diferentes tareas simultáneamente (soldados corriendo vs. gateando vs. nadando hacia sus destinos, física vs. sonido vs. hilos de IA en un juego), son "heterogéneos". Cuando realizan tareas de una en una, son "secuenciales" (corredores de relevos, bloqueando E / S). Pueden parecer muy diferentes, pero comparten una propiedad esencial: todos los tipos de actores realizan algunas esperas para garantizar que todos lleguen al punto de sincronización al mismo tiempo. entre puntos de sincronización, o "realizar la misma acción" es irrelevante para la propiedad de sincronía.

Las canalizaciones de procesamiento en una GPU son síncronas porque todas deben terminar el marco juntas e iniciar un nuevo marco juntas. Son homogéneos porque están haciendo el mismo tipo de trabajo, y todos están activos juntos. Pero el bucle principal del juego de un servidor y los hilos de bloqueo de E / S que procesan la entrada remota son heterogéneos porque realizan tipos de trabajo muy diferentes, y algunos de los hilos de E / S no harán nada en absoluto, porque no todos Se utilizan las conexiones. Aun así, están sincronizados, porque deben compartir el estado atómicamente (un jugador no debe ver una actualización parcial del mundo del juego, ni el servidor debe ver solo un fragmento de la entrada del jugador).

Asíncrono

Ahora, consideremos una "lectura de E / S asíncrona". Cuando su programa envía una solicitud al sistema operativo para leer un poco de datos del almacenamiento, la llamada vuelve inmediatamente . Ignoremos las devoluciones de llamada y centrémonos en las encuestas. En general, el momento en que los datos están disponibles para su programa no corresponde a ningún punto especial en el tiempo en lo que respecta al hilo de su programa. Si su programa no está esperando explícitamente los datos, entonces el hilo ni siquiera sabrá exactamente cuándo ocurre ese momento. Solo descubrirá que los datos están esperando la próxima vez que verifiquen.

No hay un horario de reunión especial en el que el sistema operativo y el hilo del programa acuerden entregar los datos. Son como dos barcos que pasan en la noche. La asincronía se caracteriza por esta ausencia de espera.. Por supuesto, el hilo del programa a menudo terminará esperando la operación de E / S después de todo, pero no es necesario. Felizmente puede seguir haciendo otros cálculos mientras se produce la recuperación de E / S, y solo verificará más tarde cuando tenga un momento libre. Por supuesto, una vez que el sistema operativo termina de buscar datos, tampoco se queda esperando. Simplemente coloca los datos en un lugar conveniente y continúa con su negocio. En este caso, es como si el programa entregara el testigo al sistema operativo, y el sistema operativo aparece más tarde, deja caer el testigo en el suelo junto con los datos y sale de la pista. El programa puede o no estar esperando para recibir la transferencia.

Paralelismo

Cuando marcamos una función como "asíncrona" en el software, a menudo significa que queremos paralelismo . Pero recuerde que el paralelismo no implica sincronía . Las luciérnagas son un buen ejemplo, porque también exhibieron un comportamiento sincrónico y asincrónico. Mientras que la mayoría de las moscas aparecían al unísono, muchas estaban obviamente desafinadas con el resto del grupo y aparecían más al azar. Las moscas pueden haber estado actuando simultáneamente , pero no todas estaban sincronizadas .

Ahora, cuando marcamos algún código como "asíncrono", parece divertido, porque implica que el resto del código que no está tan marcado es "sincronización". ¿Y eso que significa? ¿No insistimos en que la "sincronización" requería dos para el tango? Pero, ¿qué pasa si estamos hablando de la ejecución de código en un solo hilo? En este caso, debemos dar un paso atrás y pensar en un programa como una secuencia de estados y transiciones entre esos estados. Una declaración en un programa provoca una transición de estado. Podemos considerarlo como un "microproceso" que comienza y termina con la declaración. Los puntos de secuencia definidos por el lenguaje son, de hecho, los puntos de sincronización de estos "microprocesos". Y así, podemos ver un solo subproceso,

La integridad del lenguaje de programación garantiza que las actualizaciones de estado no interfieran entre las declaraciones, y los puntos de secuencia definen límites a través de los cuales el compilador no puede realizar optimizaciones observables. Por ejemplo, el orden de evaluación de las expresiones dentro de una declaración puede ser indefinido o subespecificado, dando al compilador la libertad de optimizar la declaración de varias maneras. Pero para cuando comience la siguiente declaración, el programa debe estar en un estado bien definido, si el PL en sí es sólido.

Por ahora, debería estar claro lo que queremos decir con "asíncrono". Significa exactamente que el contrato implícito de sincronía dentro de un bloque de código está exento para el bloque asíncrono. Se permite actualizar el estado del programa de forma independiente, sin las garantías de seguridad que normalmente implica el modelo de cálculo secuencial (coherente, sincrónico). Por supuesto, esto significa que debemos tener especial cuidado de no destruir el estado del programa con inconsistencia. Esto generalmente significa que introducimos una sincronización limitada y explícita para coordinar con el bloque asíncrono. Tenga en cuenta que esto significa que el bloque asíncrono puede ser asíncrono y síncrono en diferentes momentos. Pero recordando que la sincronización simplemente indica la existencia de un punto de sincronización, no deberíamos tener problemas para aceptar esta noción.


Puede eliminar todos sus ejemplos aquí, excepto la carrera de relevos (que ilustra claramente las nociones de software de sincronía y asincronía, mientras que las demás no), y su respuesta mejoraría significativamente.
Robert Harvey

Creo que los otros ejemplos demuestran acción simultánea versus acción heterogénea, lo que creo que causó gran parte de la confusión del OP.
Lawnmower Man

1

Una forma de pensar en ello son las instrucciones SIMD , como AVX . Aquí hay algunos ejemplos de cómo se usan.

Las instrucciones SIMD sincrónicas le permiten hacer cálculos múltiples exactamente al mismo tiempo , en el mismo hilo, operando una sola instrucción en múltiples datos.

Mientras que el subprocesamiento múltiple asincrónico le permite hacer múltiples cálculos en tiempos "probablemente" "algo" "similares".

Combine esto con las siguientes definiciones:

adjetivo síncrono syn · chro · nous | \ ˈSiŋ-krə-nəs, ˈsin-

1: sucediendo, existiendo o surgiendo precisamente al mismo tiempo [énfasis mío]

adjetivo asincrónico asyn · chro · nous | \ (ˌ) ā-ˈsiŋ-krə-nəs, -ˈsin- \

1: [...]: no sincrónico


1

Una analogía que me hizo comprender la diferencia entre Sync vs Async vs Multi-thread es la de un cocinero en la cocina.

Imagina que estás haciendo pasta. Tienes tres pasos:

  1. Hervir y escurrir la pasta.
  2. Preparar salsa
  3. Combina pasta y salsa

Método sincrónico En un escenario sincrónico solo hay una persona (hilo) haciendo todo el trabajo en secuencia. Primero hierves la pasta y te quedas allí mirándola hirviendo. Luego lo drena y lo deja a un lado. Entonces preparas la salsa. Cuando la salsa esté lista, tome la pasta, mézclela con la salsa y su plato estará listo. El problema aquí es que es ineficiente. Como estabas trabajando secuencialmente de manera sincrónica, no podías trabajar en la salsa mientras la pasta estaba hirviendo. Entonces, te hizo perder el tiempo, y tu pasta se enfrió mientras se preparaba la salsa.

Método asincrónico En este escenario, todavía hay un solo cocinero (hilo), pero mientras la pasta está hirviendo, vas y haces tu salsa. Cuando la pasta se hierve, debes called-backhacer la salsa para drenarla, y luego debes called-backterminar la salsa. Esto es más eficiente ahora, porque ahorró tiempo y su pasta no tuvo que esperar la salsa tanto tiempo.

Método multiproceso. Ahora, imagina que contratas a un nuevo cocinero. Ahora tienes dos cocineros (hilos). Mientras un cocinero está haciendo pasta, el segundo cocinero está haciendo salsa. ¿Es necesario en este escenario? No, porque hacer pasta es lo suficientemente simple como para ser eficiente con un método asincrónico. Y, la gestión de múltiples cocineros es una carga adicional. Pero si estaba haciendo un plato más complicado o más platos a la vez, son útiles varios cocineros.


Esto es realmente una muy buena analogía.
Robert Harvey

0

Una buena pregunta y términos que a menudo se usan de diferentes maneras que conducen a la confusión.

Mi respuesta es que estos términos son relativos, y lo que son relativos al programa principal que se está ejecutando (o, a veces, a un hilo).

Estos términos especifican algo sobre la operación interna y el tiempo de un programa, en cuanto a si los mensajes se envían o reciben de forma bloqueada (sincronización) o de forma no bloqueante (asíncrona). Si un hilo (el principal) se bloquea al enviar o recibir, eso es "sincronización" y si es interrumpible de alguna manera, entonces es "asíncrono". Para reiterar, estos términos se refieren a implementaciones que funcionan tanto (regular) como manejan eventos.

(En mi humilde opinión, por supuesto) una vez que un mensaje está en el cable, no hay tal cosa como sincronización vs asíncrono. En la mensajería hay un remitente y un receptor, cada uno de ellos puede tener una implementación de sincronización o asincrónica independiente de la otra, pero una vez que un mensaje está en el cable, es solo un mensaje, ya no se sincroniza o asincrona. Podemos clasificar un mensaje como una solicitud o respuesta o un mensaje unidireccional, pero eso es ortogonal para sincronizar y sincronizar (que se refiere a si la implementación está bloqueando la espera o puede ser interrumpida de alguna manera).


Sin bloqueo es distinto de asíncrono,
user207421

1
@ user207421 por favor explique, porque los llamaría sinónimos en este contexto
Jacob Raihle

0

"sincrónico" significa que dos eventos ocurren al mismo tiempo, pero ¿ qué eventos?

Cuando decimos "ejecución síncrona", queremos decir que la persona que llama y la persona que llama están ejecutando (es decir, en la pila) al mismo tiempo. Ese es probablemente el significado que buscas.

Cuando decimos "puerta lógica síncrona", queremos decir que la puerta lógica está sincronizada con el reloj de la CPU.

Cuando decimos "modelo sincrónico" en el contexto de sistemas distribuidos, queremos decir que todos los nodos ejecutan sus programas en el paso de bloqueo, y se garantiza que los mensajes enviados en el paso n llegarán al comienzo del paso n + 1.

Cuando la Especificación del lenguaje Java dice que un hilo "se sincroniza con" otro, significa que las acciones en los diferentes hilos ocurren "al mismo tiempo" (con respecto a lo que sucede antes de la relación). Y cuando dicen que dos hilos "sincronizan el acceso a un objeto", en realidad significan que los hilos se sincronizan entre sí para garantizar que nunca funcionen en el objeto al mismo tiempo.

... y estoy bastante seguro de que podría aplicar la palabra en aún más contextos, porque "las cosas suceden al mismo tiempo" es una idea bastante genérica :-)


0

Creo que la clave de tu confusión se puede resumir en:

El atributo asíncrono significa que el script se ejecutará tan pronto como se descargue, incluso si el html aún se está analizando

Lo que hay que darse cuenta es que esta oración no tiene sentido porque describe una situación imposible. Si el HTML todavía se está analizando, el proceso de descarga del script ni siquiera comenzaría si es asíncrono.

En programación, sincrónico significa:

Todos los datos que le interesan ya existen en la memoria en el momento en que ejecuta su lógica

Mientras asíncrono significa:

Algunos de los datos que le interesan aún no existen y solo existen en algún momento en el futuro

De hecho, es este aspecto no presente de la programación asincrónica lo que generalmente confunde a las personas.

La forma en que normalmente se cargan los scripts es pausar el análisis html, luego se descarga el script, cuando se completa la descarga del script, se ejecuta y luego continúa el análisis html. El análisis html y la ejecución del script ocurren en el "mismo" tiempo (el mismo tiempo significan juntos, no simultáneamente).

La forma en que asyncse cargan los scripts es que el html ve la etiqueta del script y luego recuerda descargar el script en el futuro, pero continúa analizando. El análisis html no está en pausa para la descarga de scripts. Más tarde , después de que se complete el análisis html, se descargan y ejecutan todos los scripts asíncronos. El análisis html y la ejecución del script no ocurren al mismo tiempo (nuevamente, al mismo tiempo significan juntos, en este caso se ejecutan por separado).

Entonces para resumir:

  • Los scripts síncronos se analizan junto con el html.

  • Las secuencias de comandos asincrónicas se analizan por separado en el futuro.

Por lo tanto, la definición de la asyncpropiedad no es que el script se ejecute tan pronto como se descargue; esto es cierto tanto para los scripts síncronos como para los síncronos. La definición de asíncrono es que el análisis html no espera a que se descargue el script .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.