race ifadesi, iki veya daha fazla asenk. ifadeden oluşan bir bloku eşzamanlı olarak (aynı anda) çalıştırmak için kullanılır. En hızlı ifade tamamlandığında “yarışı kazanır”. Kalan tüm “kaybeden” ifadeler iptal edilir, ardından race ifadesini takip eden ifadeler değerlendirilir.
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)Aşağıdaki kod, race ifadesinin sözdizimini gösterir.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1Aşağıdaki diyagramda ifadelerin yürütme akışı gösterilmektedir.
Race İfadesinin Kullanımı
Bir | |
| Asenk. |
|
|
|
|
| Kod blokundaki “kazanan” ifade tamamlandığında |
|
|
| Bir |
Basit görünebilir ancak race, Verse cephaneliğindeki en kullanışlı ve güçlü ifadelerden biridir. Diğer isteğe göre karmaşık asenk. kodları, bir tür erken çıkış formu halinde yapılandırılmış bir şekilde durdurmada anahtar rolü oynar. Ne zaman durdurulacağını belirlemek için gereken sınamaları, durdurulacak koddan ayrı tutarak bunu çok temiz bir şekilde yapar.
Her asenk. ifade iptal edilebilir.
Sonsuz bir
loopveyaSleep(Inf)gibi bazı asenk. ifadeler hiçbir zaman tamamlanmaz. Durdurulabilmeleri için tek yol, iptal edilmeleridir. Bu, bir veya daha fazlaraceifadesiyle eşleştirildiğinde güçlü bir strateji olabilir.Asenk. ifadeler iptal edilirse bir sonuç döndürmez, bu nedenle asenk. ifadeye dayalı olan değişkenler veya başka ifadeler bağlı durumda olmayacaktır.
Bazı karmaşık davranışları belirli bir süre sonra veya karmaşık bir olay sırası tetiklendikten sonra durdurmak mı gerekiyor? race olmadan, normalde karmaşık davranışın boyunca yoklama gibi sınamalar yerleştirmen gerekirdi. Oysa race ifadesiyle, tüm durdurma koşullarını karmaşık davranışa eş alt ifadeler olarak eklemen yeterlidir.
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 stopBir race ifadesinin sonucu, hangi alt ifadenin ilk önce tamamlandığını, yani “yarışı” kazandığını belirlemek için kullanılabilir.
# 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()