Задача — это объект, используемый для представления состояния асинхронной функции, выполняемой в данный момент. Объекты задач используются для определения места приостановки асинхронной функции и значений локальных переменных в этой точке приостановки.
Задачи выполняются одновременно в среде с кооперативной многозадачностью.
Задача может быть с длительным сроком жизни, который зависит от срока жизни одного или нескольких обновлений до её завершения.
Задачи могут быть выполняться последовательно, совмещённо, с наложением в любом логическом порядке.
Последовательный и совмещённый характер выполнения задач задаётся с помощью выражений со структурированным или неструктурированным одновременным выполнением.
Каждая задача с одновременным выполнением может быть выполняться последовательно, совмещённо, с наложением по времени в любом логическом порядке. Внутри задача может иметь одну или несколько вызывающих функций и ни одной или несколько зависимых подзадач, которые формируют граф вызовов (в отличие от стека вызовов).
Задача похожа на поток, но имеет преимущество перед потоками в том, что переключение контекста между задачами не связано с какими-либо системными вызовами, ресурсозатратным сохранением состояния контекста или вызовами, блокирующими процессор, и процессор может быть использован на 100%). Вам не нужна синхронизация, такая как мьютексы или семафоры, для защиты критических разделов, и нет необходимости в поддержке со стороны операционной системы.
Класс task(t:type)
позволяет напрямую выполнять программные запросы и управлять задачами неструктурированным способом, хотя для большей наглядности, лучшей производительности и эффективности рекомендуется управлять задачами с помощью выражений со структурированным одновременным выполнением.
На данный момент для задачи
доступна только одна функция: Await()
, которая ожидает завершения текущей задачи. Она фактически закрепляет задачу и добавляет для неё вызывающую функцию, к которой она может вернуться в точке вызова.
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
Аналогично приведённому выше примеру, в примере ниже используются выражения со структурированным одновременным выполнением:
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()")