Puedes usar la expresión sync (sincronizar) para ejecutar dos o más expresiones asíncronas al mismo tiempo. Por ejemplo:
# Las tres funciones asíncronas se inician al mismo tiempo
Results = sync:
AsyncFunction1() # tarea 1
AsyncFunction2() # tarea 2
AsyncFunction3() # tarea 3
# Se llama después de que se completen las tres tareas (independientemente del orden)
MyLog.Print("Lista de resultados completa: {Results}")
El siguiente código muestra la sintaxis de la expresión sync con un diagrama que muestra el flujo de ejecución de las expresiones.
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
Uso de la expresión sync
Dónde puedes usar la expresión sync |
Contextos asíncronos |
Tiempo de invocación de la expresión sync |
Asíncrono |
Requisitos del bloque de código sync |
El cuerpo de la expresión sync debe tener por lo menos dos expresiones asíncronas; de lo contrario, no hay necesidad de ejecutar simultáneamente las expresiones. |
Qué hace la expresión sync |
Ejecuta concurrentemente todas las expresiones en el bloque de código y espera a que todas finalicen antes de ejecutar la siguiente expresión después de sync. |
Cuándo se completa la expresión sync |
Cuando todas las expresiones del bloque de código sync se han completado. |
Cuándo se inicia la siguiente expresión después de sync |
Cuando todas las expresiones del bloque de código sync se han completado. |
Resultado de la expresión sync |
Su resultado es una tupla de resultados de todas las expresiones en el orden en el que se especificaron las expresiones de nivel superior. Los tipos de resultado de las expresiones pueden ser de cualquier tipo y cada elemento de tupla tendrá el tipo de su expresión correspondiente. |
Por lo menos dos expresiones de nivel superior deben ser asíncronas.
sync:
AsyncFunction1()
MyLog.Print("Segunda expresión de nivel superior")
AsyncFunction2()
MyLog.Print("Tercera expresión de nivel superior")
sync:
AsyncFunction1()
# Error: se esperaban al menos dos expresiones de nivel superior
Las expresiones de nivel superior pueden ser expresiones compuestas, como bloques de código anidados:
# la sincronización puede tener también expresiones compuestas
# con cada expresión de nivel superior su propia tarea
sync:
block: # tarea 1
# Evaluado en orden de serie
AsyncFunction1a()
AsyncFunction1b()
block: # tarea 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # tarea 3
# AsyncFunction1a(), AsyncFunction2a() y AsyncFunction3() comienzan todas esencialmente al mismo tiempo.
Como las tuplas pueden usarse como argumentos autodispersables, las expresiones sync pueden usarse directamente como argumentos debido a que el resultado es una tupla. Esto permite a los argumentos asíncronos evaluar simultáneamente y la función a la que se pasan se llama cuando se han completado todas las expresiones del bloque de código sync.
# Los tres argumentos de la corrutina comienzan su evaluación al mismo tiempo
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# No es necesario que todos los argumentos sean asíncronos, un mínimo de dos justifica el uso de sync
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})