Vous pouvez utiliser l'expression sync pour exécuter simultanément deux ou plusieurs expressions asynchrones. Par exemple :
# Les trois fonctions asynchrones démarrent effectivement en même temps
Results = sync:
AsyncFunction1() # tâche 1
AsyncFunction2() # tâche 2
AsyncFunction3() # tâche 3
# Appelé une fois les trois tâches terminées (indépendamment de l'ordre)
MyLog.Print("Done with list of results: {Results}")
Le code suivant montre la syntaxe de l'expression sync, avec un diagramme illustrant le flux d'exécution des expressions.
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
(w:600)
Utiliser l'expression sync
Où utiliser une expression sync |
Contextes asynchrones |
Durée d'appel de l'expression sync |
Asynchrone |
Exigences concernant le code de bloc de l'expression sync |
Le corps de l'expression sync doit disposer d'au moins deux expressions asynchrones ; dans le cas contraire, il n'est pas nécessaire d'exécuter les expressions simultanément. |
Ce que fait l'expression sync |
Exécute simultanément toutes les expressions dans son bloc de code et attend que toutes soient terminées avant d'exécuter l'expression qui suit l'expression sync. |
Quand se termine l'expression sync |
Quand toutes les expressions du bloc de code de l'expression sync sont terminées. |
Quand démarre l'expression suivante après sync |
Quand toutes les expressions du bloc de code de l'expression sync sont terminées. |
Résultat de l'expression sync |
Son résultat est un tuple de résultats de chaque expression dans l'ordre où les expressions de niveau supérieur ont été spécifiées. Les types de résultats des expressions peuvent être de n'importe quel type et chaque élément du tuple possède le type de son expression correspondante. |
Au moins deux expressions de niveau supérieur doivent être asynchrones.
sync:
AsyncFunction1()
MyLog.Print("Second top level expression")
AsyncFunction2()
MyLog.Print("Third top level expression")
sync:
AsyncFunction1()
# Erreur : au moins deux expressions de niveau supérieur étaient attendues
Les expressions de niveau supérieur peuvent être des expressions composées, par exemple des blocs de code imbriqués :
# sync peut aussi avoir des expressions composées
# avec chaque expression de niveau supérieur, sa propre tâche
sync:
block: # tâche 1
# Évalué dans l'ordre sériel
AsyncFunction1a()
AsyncFunction1b()
block: # tâche 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2b()
AsyncFunction3() # tâche 3
# AsyncFunction1a(), AsyncFunction2a() et AsyncFunction3() démarrent en même temps
Dans la mesure où il est possible d'utiliser les tuples en tant qu'arguments d'autoprojection, les expressions sync peuvent être utilisées directement en tant qu'arguments, car elles ont un résultat de type tuple. Il est ainsi possible d'évaluer les arguments asynchrones de façon simultanée et d'appeler la fonction à laquelle ils sont transmis lorsque toutes les expressions dans le bloc de code de l'expression sync sont terminées.
# Les trois arguments de la coroutine commencent leur évaluation en même temps
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# Tous les arguments ne doivent pas être asynchrones, un minimum de deux justifie l'utilisation de l'expression sync
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})