Du kannst den „sync“ Ausdruck verwenden, um zwei oder mehr async-Ausdrücke gleichzeitig auszuführen. Zum Beispiel:
# Alle drei asynchronen Funktionen werden praktisch gleichzeitig gestartet
Results = sync:
AsyncFunction1() # Aufgabe 1
AsyncFunction2() # Aufgabe 2
AsyncFunction3() # Aufgabe 3
# Werden nach Abschluss aller drei Aufgaben (unabhängig von der Reihenfolge) aufgerufen
MyLog.Print(„Wird mit folgendem Ergebnis ausgeführt: {Results}“)
Der folgende Code zeigt die Syntax für den Ausdruck „sync“ mit einem dazugehörigen Diagramm, das den Ausführungs- Ablauf der Ausdrücke zeigt.
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
Verwenden des „sync“-Ausdrucks
| Wo du einen „sync“-Ausdruck verwenden kannst | Async Kontexte |
| Aufrufzeit des „sync“-Ausdrucks | Async |
| Voraussetzungen für den „sync“-Codeblock | Der Body des „sync“-Ausdrucks muss mindestens zwei Ausdrücke haben, die asynchron sind; andernfalls besteht für dich keine Notwendigkeit, die Ausdrücke gleichzeitig auszuführen. |
| Was der „sync“-Ausdruck macht | Er führt alle Ausdrücke in seinem Codeblock gleichzeitig aus und wartet, bis sie alle beendet sind, bevor der nächste Ausdruck nach dem „sync“ ausgeführt wird. |
| Wenn alle Ausdrücke im „sync“-Codeblock abgeschlossen sind, wird der „sync“-Ausdruck beendet. | |
| Wann der nächste Ausdruck nach „sync“ beginnt | Wenn alle Ausdrücke im Codeblock „sync“ abgeschlossen sind. |
Ergebnisse des sync-Ausdrucks |
Sein Ergebnis ist ein Tupel der Ergebnisse von jedem Ausdruck in der Reihenfolge, in der die Top-Level-Ausdrücke angegeben wurden. Die Ergebnis-Typen der Ausdrücke können jeder beliebiger Typ sein, und jedes Tupel-Element wird den Typ des entsprechenden Ausdrucks haben. |
Mindestens zwei Top-Level-Ausdrücke müssen asynchron sein.
sync:
AsyncFunction1()
MyLog.Print(„Zweiter Top-Level-Ausdruck“)
AsyncFunction2()
MyLog.Print(„Dritter Top-Level-Ausdruck“)
sync:
AsyncFunction1()
# Fehler: Mindestens zwei Top-Level-Ausdrücke werden erwartet
Top-Level-Ausdrücke können zusammengesetzte Ausdrücke sein, wie z. B: verschachtelte Codeblocks:
# sync kann auch zusammengesetzte Ausdrücke haben
# wobei jeder Top-Level-Ausdruck eine eigene Aufgabe hat
sync:
block: # Aufgabe 1
# In serieller Reihenfolge ausgewertet
AsyncFunction1a()
AsyncFunction1b()
block: # Aufgabe 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # Aufgab 3
# AsyncFunction1a(), AsyncFunction2a() und AsyncFunction3() starten alle im Wesentlichen zur gleichen Zeit
Da Tupel als self-splatting Argumente verwendet werden können, können „sync“-Ausdrücke direkt als Argumente verwendet werden, da sie ein Tupel-Ergebnis haben. Dies ermöglicht es, async Argumente gleichzeitig auszuwerten, und die Funktion, an die sie übergeben werden, wird aufgerufen, wenn alle Ausdrücke im Synchronisierungscodeblock abgeschlossen sind.
# Alle drei Koroutine-Argumente beginnen mit ihrer Auswertung zur gleichen Zeit
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# Nicht jedes Argument muss asynchron sein – ein Minimum von zwei rechtfertigt die Verwendung von sync
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})