Puedes utilizar la [expresión] sync(verse-glossary#expression) para ejecutar dos o más expresiones async al mismo tiempo. Por ejemplo:
# Las tres funciones asíncronas se inician efectivamente 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("Finalizada la lista de resultados: {Results}")
El código siguiente muestra la sintaxis de la expresión sync con un diagrama adjunto 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 utilizar una expresión sync |
Contextos asíncronos |
Hora de invocación de la expresión sync |
Async |
Requisitos para el bloque de código sync |
El cuerpo de la expresión sync debe tener al menos dos expresiones que sean asíncronas; de lo contrario, no es necesario que ejecutes las expresiones simultáneamente. |
Qué hace la expresión sync |
Ejecuta todas las expresiones de su bloque de código de forma simultánea y espera a que terminen todas antes de ejecutar la siguiente expresión después de sync. |
Cuando la expresión sync se completa |
Cuando todas las expresiones del bloque de código sync se han completado. |
Cuando comienza 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 cada expresión en el orden en que se especificaron las expresiones de nivel superior. Los tipos de resultado de las expresiones pueden ser de cualquier tipo, y cada elemento de la tupla tendrá el tipo de su expresión correspondiente. |
Al 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 siendo 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() todas empiezan básicamente al mismo tiempo.
Puesto que las tuplas pueden utilizarse como argumentos autodispersables, las expresiones sync pueden utilizarse directamente como argumentos, ya que producen una tupla como resultado. Esto permite que los argumentos asíncronos se evalúen simultáneamente y que se llame a la función a la que se pasan cuando se completan todas las expresiones del bloque de código de sincronización.
# 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()})