Puoi utilizzare l'espressione syncper eseguire due o più espressioni async contemporaneamente. Ad esempio:
# Tutte e tre le funzioni asincrone si avviano effettivamente contemporaneamente
Results = sync:
AsyncFunction1() # task 1
AsyncFunction2() # task 2
AsyncFunction3() # task 3
# Chiamato dopo il completamento di tutte e tre le attività (indipendentemente dall'ordine)
MyLog.Print("Completato con l'elenco dei risultati: {Results}")
Il codice seguente mostra la sintassi dell'espressione sync con un diagramma associato che mostra il flusso esecuzione delle espressioni.
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
Utilizzo dell'espressione sync
Possibilità di utilizzo di un'espressione sync |
Contesti asincroni |
Tempo di invocazione di un'espressione sync |
Async. |
Requisiti per il blocco di codice sync |
Il corpo dell'espressione sync deve contenere almeno due espressioni asincrone; in caso contrario, non è necessario eseguire le espressioni contemporaneamente. |
Che cosa fa l'espressione sync |
Esegue tutte le espressioni nel suo blocco di codice in modo simultaneo e attende che tutte finiscano prima di eseguire l'espressione successiva dopo sync. |
Al termine dell'espressione sync |
Quando tutte le espressioni nel blocco di codice sync sono state completate. |
Quando viene avviata l'espressione successiva a sync |
Quando tutte le espressioni nel blocco di codice sync sono state completate. |
Risultato dell'espressione sync |
Il suo risultato è una tupla di risultati di ogni espressione nell'ordine in cui sono state specificate le espressioni di primo livello. I tipi di risultato delle espressioni possono essere di qualsiasi tipo e ogni elemento della tupla avrà il tipo dell'espressione corrispondente. |
Almeno due espressioni di primo livello devono essere asincrone.
sync:
AsyncFunction1()
MyLog.Print("Second top level expression")
AsyncFunction2()
MyLog.Print("Third top level expression")
sync:
AsyncFunction1()
# Errore: sono previste almeno due espressioni di primo livello
Le espressioni di primo livello possono essere espressioni composte, ad esempio blocchi di codice annidati:
# sync può anche avere espressioni composte
# con ogni espressione di primo livello il proprio compito
sync:
block: # task 1
# Valutato in ordine seriale
AsyncFunction1a()
AsyncFunction1b()
block: # task 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # task 3
# AsyncFunction1a(), AsyncFunction2a() e AsyncFunction3() si avviano tutte essenzialmente contemporaneamente
Poiché le tuple si possono utilizzare come argomenti autospiattellanti, le espressioni sync si possono utilizzare direttamente come argomenti poiché hanno un risultato di tupla. In questo modo gli argomenti asincroni si possono valutare contemporaneamente e la funzione a cui vengono passati viene chiamata quando tutte le espressioni nel blocco di codice sync sono state completate.
# Tutti e tre gli argomenti di coroutine iniziano la loro valutazione contemporaneamente
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# # Non tutti gli argomenti devono essere asincroni - un minimo di due giustifica l'utilizzo di sync
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})