race
式は、2 つ以上の async 式のブロックを並列で (同時に) 実行するために使用されます。 最速の式が完了すると、その式が「レースに勝ち」、 「レースに負けた」残りすべての式がキャンセルされた後、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 の中で最も有用で強力な式の 1 つです。 重要となるのは、他の任意の複雑な async コードを構造化された方法 (早いものから終了するという形式) で停止することです。 これは、停止するタイミングを見極めるのに必要なあらゆるテストと停止するコードを切り離しておくという、非常にクリーンな方法で行います。
一定の時間が経ってから、または一連の複雑なイベントがトリガーされた後に複雑な動作を停止する必要がある場合、 race
を使用しなければ、ポーリングなど、通常は複雑な動作全体にわたるテストを行わなければなりません。 一方、race
を使用すれば、複雑な動作に対する兄弟部分式として all stop 条件を追加するだけで済みます。
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()