Вы можете использовать выражение sync для запуска двух или более асинхронных выражений одновременно. Пример:
# Все три асинхронные функции фактически запускаются в одно и то же время
Results = sync:
AsyncFunction1() # задача 1
AsyncFunction2() # задача 2
AsyncFunction3() # задача 3
# Вызывается после выполнения всех трех задач (независимо от порядка)
MyLog.Print("Завершено со списком результатов: {Results}")
В показанном ниже коде представлен синтаксис выражения sync с диаграммой выполнения потока выражений.
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
Использование выражения sync
Где можно использовать выражение sync |
Асинхронные контексты |
Время вызова выражения sync |
Немедленно. |
Требования к блоку кода sync |
Тело выражения sync должно содержать как минимум два выражения, которые должны быть асинхронны. В противном случае не имеет смысла запускать их одновременно. |
Что делает выражение sync |
Выполняет все выражения в своём блоке кода конкурентно и ждёт их завершения, прежде чем выполнить следующее выражение после sync. |
Когда завершается выражение sync |
Когда будут завершены все выражения в блоке кода sync. |
Когда запускается следующее выражение sync |
Когда будут завершены все выражения в блоке кода sync. |
Результат выражения sync |
Его результат представляет собой кортеж результатов всех выражений в том порядке, в каком записаны выражения верхнего уровня. Типы результатов выражений могут быть любыми, а каждый элемент кортежа будет иметь тип соответствующего выражения. |
Как минимум два выражения верхнего уровня должны быть асинхронными.
sync:
AsyncFunction1()
MyLog.Print("Второе выражение верхнего уровня")
AsyncFunction2()
MyLog.Print("Третье выражение верхнего уровня")
sync:
AsyncFunction1()
# Ошибка: ожидается как минимум два выражения верхнего уровня
Выражения верхнего уровня могут быть составными выражениями, например это могут быть вложенные блоки кода.
# sync также может содержать составные выражения
# с отдельной задачей для каждого выражения верхнего уровня
sync:
block: # задача 1
# Рассчитываются последовательно
AsyncFunction1a()
AsyncFunction1b()
block: # задача 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # задача 3
# AsyncFunction1a(), AsyncFunction2a() and AsyncFunction3() фактически запускаются одновременно
Поскольку кортежи могут использоваться в качестве самораспаковывающихся аргументов, выражения sync можно использовать непосредственно в качестве аргументов, так как они содержат результат кортежа. Это позволяет выполнять расчёт асинхронных аргументов одновременно, а функция, которой они передаются, вызывается после завершения всех выражений в блоке кода sync.
# Все три аргумент сопрограммы фактически запускаются в одно и то же время
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# Не каждый аргумент должен быть асинхронным — чтобы использование sync было оправданным, достаточно всего лишь двух
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})