A expressão race é usada para executar um bloco de duas ou mais expressões assíncronas ao mesmo tempo (simultaneamente). Quando a expressão mais rápida é concluída, ela "ganha a corrida". Como as expressões "perdedoras" restantes são canceladas, qualquer expressão depois de race será avaliada.
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)O código a seguir mostra a sintaxe da expressão race.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1O diagrama abaixo mostra o fluxo de execução das expressões.
Uso da expressão "race"
Onde uma expressão | |
Tempo de invocação da expressão | Assíncrona |
Requisitos do bloco de código de | O corpo da expressão |
O que faz a expressão | Semelhante a |
Quando a expressão | A expressão |
Quando inicia a expressão que vem depois que | Qualquer expressão que vem depois de |
O resultado da expressão | O resultado de uma expressão |
Isso pode parecer simples, mas race é uma das expressões mais úteis e poderosas no arsenal de Verse. Ela é a chave para interromper qualquer outro código assíncrono complexo arbitrariamente de maneira estruturada. É uma forma de saída antecipada. Ele faz isso de uma maneira muito limpa, mantendo todos os testes necessários para determinar quando parar separados do código que deve ser interrompido.
Expressões assíncronas podem ser canceladas.
Algumas expressões assíncronas, como um
loopouSleep(Inf)sem fim, nunca serão concluídas. A única maneira de interrompê-las é cancelá-las. Essa pode ser uma estratégia sólida quando combinada com uma ou mais expressõesrace.Expressões assíncronas não terão um resultado se forem canceladas. Portanto, qualquer variável ou outra expressão que dependa de uma expressão assíncrona cancelada não seria vinculada.
Precisa interromper algum comportamento complexo após o disparo de uma quantidade de tempo ou sequência complexa de eventos? Sem race, normalmente você precisaria espalhar testes, como difundi-los em todo o seu comportamento complexo. Com race, basta adicionar todas as condições de parada como subexpressões irmãs ao comportamento complexo.
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 stopUm resultado de race pode ser usado para determinar qual subexpressão terminou primeiro ou venceu a corrida.
# 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()