Выражение race («гонка») используется для конкурентного (одновременного) выполнения блока из двух или более асинхронных выражений. Выражение, которое выполнится быстрее, «выиграет гонку». Любые оставшиеся «проигравшие» выражения отменяются, а затем оценивается любое выражение, следующее за race.
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)В следующем коде показан синтаксис выражения race.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1На блок-схеме ниже представлен ход выполнения потока выражений.
Использование выражения race
Когда можно использовать выражение | |
Время обращения к выражению | Асинхронность |
Требования к блоку кода | Тело выражения |
Что делает выражение | Аналогично |
Когда завершается выражение | Выражение |
Когда запускается следующее выражение после | Любое выражение, следующее за выражением |
Результат выражения | Результатом выражения |
Это выражение может показаться простым, но race — одно из самых полезных и мощных выражений в арсенале Verse. Оно позволяет остановить другой произвольный сложный асинхронный код структурированным способом — досрочным выходом из блока. Оно делает это очень простым способом, отделяя все тесты, необходимые для определения момента остановки, от кода, который должен быть остановлен.
Любое асинхронное выражение можно отменить.
Некоторые асинхронные выражения, такие как бесконечный цикл
loopилиSleep(Inf), никогда не завершаются. Единственный способ их остановить — это отменить их. Их можно очень эффективно применять в сочетании с одним или несколькими выражениямиrace.Асинхронные выражения не будут иметь результата в случае отмены, поэтому любая переменная или другое выражение, зависящее от отменённого асинхронного выражения, не будет привязано.
Хотите остановить какое-то сложное поведение по истечении некоторого времени или после запуска какой-то сложной последовательности событий? Если бы не выражение race, вам бы пришлось использовать тесты, к примеру опрос, на протяжении всего сложного поведения. При использовании race к сложному поведению нужно лишь добавить все условия остановки в качестве подвыражений одного уровня.
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 stopРезультат race можно использовать, чтобы определить, какое подвыражение завершилось первым или «выиграло гонку».
# 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()