Możesz użyć wyrażenia synchronicznego, aby uruchomić dwa lub więcej wyrażeń asynchronicznie w tym samym czasie. Na przykład:
# Wszystkie trzy funkcje asynchroniczne uruchamiają się w tym samym czasie
Results = sync:
AsyncFunction1() # task 1
AsyncFunction2() # task 2
AsyncFunction3() # task 3
# Jest to wywoływane po ukończeniu wszystkich trzech zadań (niezależnie od kolejności)
MyLog.Print("Wykonano z listą wyników: {Results}")
Poniższy kod przedstawia składnię wyrażenia sync wraz z towarzyszącym diagramem przedstawiającym przepływ wyrażeń wykonanie.
wyrażenie0
sync:
slow-expression
mid-expression
fast-expression
wyrażenie1
Użycie wyrażenia synchronizacji
Miejsce użycia wyrażenia sync |
Konteksty asynchroniczne |
Czas wywołania wyrażenia sync |
Asynchroniczne |
Wymagania dotyczące bloku kodu sync |
Korpus wyrażenia sync musi zawierać co najmniej dwa wyrażenia, które są asynchroniczne; w innym wypadku nie ma konieczności jednoczesnego uruchamiania wyrażeń. |
Co powoduje wyrażenie sync |
Wykonuje wszystkie wyrażenia w bloku kodu równocześnie i czeka, aż wszystkie one zostaną zakończone przed wykonaniem następnego wyrażenia następującego po sync. |
Po zakończeniu wyrażenia synchronicznego |
Kiedy wszystkie wyrażenia w bloku kodu synchronicznym zostały ukończone. |
Po rozpoczęciu następnego wyrażenia po sync |
Kiedy wszystkie wyrażenia w bloku kodu sync zostały ukończone. |
Wynik wyrażenia sync |
Jego wynik to krotka wyników z każdego wyrażenia, w której zachowana jest kolejność, w jakiej zdefiniowane zostały wyrażenia ogólne. Wyrażenia mogą zwracać wyniki dowolnego typu, a typ każdego elementu krotki będzie zgodny z typem odpowiadającego wyrażenia. |
Co najmniej dwa wyrażenia najwyższego poziomu muszą być asynchroniczne.
sync:
AsyncFunction1()
MyLog.Print("Drugie wydarzenie najwyższego poziomu")
AsyncFunction2()
MyLog.Print("Trzecie wydarzenie najwyższego poziomu")
sync:
AsyncFunction1()
# Błąd: oczekiwano co najmniej dwóch wyrażeń najwyższego poziomu
Wyrażenia najwyższego poziomu mogą być wyrażeniami kompleksowymi, takimi jak zagnieżdżone bloki kodu:
# sync może również zawierać wyrażenia złożone
# z każdym wyrażeniem najwyższego poziomu jego własne zadanie
sync:
block: # zadanie 1
# Oceniane w kolejności seryjnej
AsyncFunction1a()
AsyncFunction1b()
block: # zadanie 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # task 3
# AsyncFunction1a(), AsyncFunction2a() i AsyncFunction3() – wszystkie uruchamiają się praktycznie w tym samym czasie
Ponieważ krotek można używać jako self-splatting argumentów, wyrażeń sync można używać bezpośrednio jako argumentów, ponieważ dają one wynik krotki. Dzięki temu argumenty asynchroniczne mogą być oceniane jednocześnie, a funkcja, do której są przekazywane, jest wywoływana, gdy wszystkie wyrażenia w bloku kodu synchronicznego zostaną ukończone.
# Wszystkie trzy argumenty koprocedury rozpoczynają swoją ocenę w tym samym czasie
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# Nie każdy argument musi być asynchroniczny – co najmniej dwa uzasadniają użycie sync
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})