Wyrażenie wyścigu race służy do współbieżnego (jednoczesnego) wykonywania bloku dwóch lub większej liczby wyrażeń asynchronicznych. "Wyścig wygrywa" wyrażenie, które zakończy się najszybciej. Wszelkie pozostałe „przegrywające” wyrażenia są anulowane, a następnie każde wyrażenie, które następuje po race jest oceniane.
set WinnerResult = race:
# All three async functions start at the same time
AsyncFunctionLongTime()
AsyncFunctionShortTime() # This will win and its result is used
AsyncFunctionMediumTime()
# Next expression is called after the fastest async function completes
# / when the fastest/shortest async function task (AsyncFunctionShortTime()) completes
# and all other async function tasks (AsyncFunctionLongTime(), AsyncFunctionMediumTime()) are canceled.
NextExpression(WinnerResult)Poniższy kod przedstawia składnię dla wyrażenia race.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1Poniższy schemat przedstawia przepływ, zgodnie z którym wykonywane są wyrażenia.
Użycie wyrażenia race
Gdzie można użyć wyrażenia | |
Czas wywołania wyrażenia | Async |
Wymagania dotyczące bloku kodu | Ciało wyrażenia |
Co wykonuje wyrażenie | Działa podobnie jak wyrażenie |
Czas ukończenia wyrażenia | Wyrażenie |
Kiedy rozpoczyna się kolejne wyrażenie po wyrażeniu | Każde wyrażenie następujące po wyrażeniu |
Wynik wyrażenia | Wynikiem wyrażenia |
Choć może się wydawać proste, wyrażenie race to jedno z najbardziej użytecznych i potężnych wyrażeń w arsenale Verse. Jest to klucz do zatrzymania innego arbitralnie złożonego kodu asynchronicznego w uporządkowany sposób – forma wcześniejszego wyjścia. Robi to w bardzo czysty sposób, utrzymując wszelkie testy potrzebne do określenia momentu zatrzymania oddzielone od kodu, który ma zostać zatrzymany.
Każde wyrażenie asynchroniczne można anulować.
Niektóre wyrażenia asynchroniczne, takie jak niekończąca się
pętlalubSleep(Inf)nigdy nie zostaną ukończone. Jedynym sposobem na ich zatrzymanie jest ich anulowanie. Może to być silna strategia w połączeniu z jednym lub kilkoma wyrażeniamirace.Wyrażenia asynchroniczne nie będą miały wyniku, jeśli zostaną anulowane, więc każda zmienna lub inne wyrażenie, które zależy od anulowanego wyrażenia asynchronicznego, nie będzie związane.
Chcesz zatrzymać jakieś złożone zachowanie po pewnym czasie lub po wyzwoleniu złożonej sekwencji zdarzeń? Bez race normalnie konieczne byłoby stosowanie różnych testów, takich jak sondowanie w całym złożonym zachowaniu. W przypadku race wystarczy dodać wszystkie warunki zatrzymania jako równorzędne podwyrażenia do złożonego zachowania.
race:
ComplexBehavior() # Could be simple or as complex as a whole game
Sleep(60.0) # Timeout after one minute
EventTrigger() # Some other arbitrary test that can be used to stopWynik race może być użyty do określenia, które podwyrażenie ukończyło wyścig jako pierwsze lub wygrało.
# Adding a unique result to subexpressions so it can
# be used to determine which subexpression won
Winner := race:
block: # task 1
AsyncFunction1()
1
block: # task 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()