Добавить объявление

Structured Concurrency: последовательное vs параллельное выполнение задач

В Swift современный подход к многопоточности: Structured Concurrency - позволяет легко управлять асинхронными операциями, сохраняя читаемость кода. Рассмотрим два ключевых сценария: последовательное и параллельное выполнение.

Последовательное выполнение:


Когда задачи зависят друг от друга или должны выполняться по очереди:

func fetchData() async {
// Сначала загружаем аккаунты, затем задачи
let accounts = await fetchAccounts()
let tasks = await fetchTasks(accounts: accounts)

print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}

Особенности:


  • Выполняется пошагово: fetchAccounts() → fetchTasks()

  • Подходит, если второй запрос требует данных из первого.

  • Простота отладки (очевидный порядок выполнения).

Параллельное выполнение:


Когда задачи независимы и можно сэкономить время, выполняя их одновременно:

func fetchData() async {
// Параллельный запуск
async let accountsRequest = await fetchAccounts()
async let tasksRequest = await fetchTasks()

// Ожидаем результаты
let (accounts, tasks) = await (accountsRequest, tasksRequest)

print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}

Особенности:


  • Обе функции запускаются одновременно.

  • Общее время выполнения ≈ времени самой долгой задачи.

  • async let создает параллельное подзадачи.

  • Результаты доступны только после await.

Ключевые принципы Structured Concurrency:



Иерархия задач:
  • Родительская задача ждет завершения дочерних (async let).

  • Отмена родительской отменяет и дочерние.


Безопасность:
  • Компилятор контролирует await, предотвращая deadlock.

  • Ошибки распространяются корректно.


Эффективность:
  • Система сама решает, сколько потоков использовать.

  • Нет ручного управления (DispatchQueue не нужен).

Вывод:


  • await - для последовательного кода.

  • async let - для параллельных операций.

  • Structured Concurrency делает асинхронный код предсказуемым.


Используйте эти подходы, чтобы оптимизировать работу с сетью, базами данных или тяжелыми вычислениями.
07.07.2025 10 389