Un task è un oggetto utilizzato per rappresentare lo stato di unafunzione asincrona in esecuzione. Gli oggetti task vengono utilizzati per identificare il punto in cui una funzione asincrona è sospesa e i valori delle variabili locali in quel punto di sospensione.
I task vengono eseguiti contemporaneamente in un ambiente multitasking cooperativo.
Un task può essere di durata, in base alla durata di uno o più aggiornamenti prima del completamento.
I task possono essere sequenziali, sovrapposti, scaglionati e così via, in qualsiasi ordine logico.
La sequenza e il flusso di sovrapposizione di task è specificati attraversa l'utilizzo di espressioni di concorrenza strutturata o non strutturata.
Ogni task può essere disposto contemporaneamente in sequenza, sovrapposto, scaglionato e così via, in qualsiasi ordine logico di tempo. Internamente, un task può avere un chiamante (o anche più chiamanti) e zero o più sottotask dipendenti che formano un grafico delle chiamate (al contrario di uno chiama pila).
Un task è simile a un thread, ma presenta il vantaggio rispetto ai thread in quanto il passaggio da un contesto all'altro in task non comporta alcuna chiamata di sistema, un costoso salvataggio dello stato di contesto o del blocco del processore e un processore può essere utilizzato al 100%). Non è necessaria la sincronizzazione come mutex o semaforo per sorvegliare la sezione critica e non è necessario il supporto del sistema operativo.
La classe task(t:type)
permette l'interrogazione programmatica diretta e la manipolazione di task in modo non strutturato, sebbene in genere sia consigliabile che i task siano manipolati attraverso espressioni della concorrenza strutturata per maggiore chiarezza, potenza ed efficienza.
Attualmente, l'unica funzione esposta per task
è Await()
che attende che il Task corrente sia completato. Questo essenzialmente ancora un task e aggiunge un chiamante a cui tornare nel punto di chiamata.
spawn{AsyncFunction3()}
# Get task to query / give commands to
# starts and continues independently
Task2 := spawn{Player.MoveTo(Target1)}
Sleep(1.5) # Wait 1.5 Seconds
MyLog.Print("1.5 Seconds into Move_to()")
Task2.Await() # wait until MoveTo() completed
Simile all'esempio precedente, quello seguente utilizza espressioni di concorrenza strutturata:
sync:
AsyncFunction3() # Task 1
block:
Player.MoveTo(Target1) # Task 2
Sleep(0.5) # Wait 0.5 Seconds
Target1.MoveTo(Target2)
block: # Task 3
Sleep(1.5) # Wait 1.5 Seconds
MyLog.Print("1.5 Seconds into Move_to()")