0Pricing
Swift Academy · Урок

async let, Task и отмена

Запускайте работу параллельно с помощью async let , создавайте независимые задачи Task и обрабатывайте отмену совместно с вызывающим кодом.

«async let, Task и отмена» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.

Что мы рассмотрим

Вы научитесь:

  • Запускать параллельные задачи одного уровня с помощью async let
  • Запускать независимые единицы работы через Task { }
  • Реагировать на отмену с помощью кооперативных проверок

Основы async let

async let запускает дочерние задачи параллельно в одной области видимости; перед выходом из неё необходимо использовать await.

func loadA() async -> Int { try? await Task.sleep(nanoseconds: 200_000_000); return 1 }
func loadB() async -> Int { try? await Task.sleep(nanoseconds: 200_000_000); return 2 }

Task {
    async let a = loadA()
    async let b = loadB()
    // Both start immediately; awaiting joins them
    let sum = await (a + b)
    print("sum =", sum) // 3
}

Независимая задача

Используйте Task {}, чтобы запустить независимую задачу, а затем await t.value, чтобы получить её результат.

// Create an independent task (not tied to current scope)
func fetchMessage() async -> String {
    try? await Task.sleep(nanoseconds: 150_000_000)
    return "hello"
}

let t = Task { await fetchMessage() }
Task {
    print("from Task:", await t.value)  // waits for the independent task's result
}

Основы отмены

Отмена выполняется кооперативно. Выполните проверку с помощью Task.checkCancellation() (она выбрасывает ошибку) или прочитайте Task.isCancelled и завершите работу раньше.

// A long-running job that checks for cancellation
enum WorkError: Error { case cancelled }

func longJob() async throws -> Int {
    var total = 0
    for i in 1...10 {
        try Task.checkCancellation()        // throws CancellationError if cancelled
        try? await Task.sleep(nanoseconds: 50_000_000)
        total += i
    }
    return total
}

let job = Task { try await longJob() }
Task {
    // Cancel after a short delay
    try? await Task.sleep(nanoseconds: 120_000_000)
    job.cancel()
    do {
        _ = try await job.value
    } catch {
        print("job cancelled")              // expected
    }
}

Отмена от родителя к детям

Когда родительская задача отменяется, дочерние задачи узнают об этом и должны быстро завершиться после проверки.

// Propagate cancellation from parent to children using async let
func part(_ id: Int) async throws -> String {
    try Task.checkCancellation()
    try? await Task.sleep(nanoseconds: 80_000_000)
    return "P\(id)"
}

Task {
    do {
        async let p1 = part(1)
        async let p2 = part(2)
        // Cancel the whole operation before awaiting
        Task.currentTask?.cancel()   // cancel self -> children see cancellation
        let out = try await [p1, p2].joined(separator: ",")
        print(out)
    } catch {
        print("parent cancelled; children stopped")
    }
}

Рекомендации

Советы:

  • Используйте async let для параллельных задач одного уровня; всегда ожидайте их в той же области видимости.
  • Отменяйте задачу с помощью task.cancel(), а внутри работы вызывайте Task.checkCancellation().
  • Предпочитайте небольшие асинхронные функции: их легко отменять и тестировать.

Поведение при кооперативной отмене

Быстрая проверка: как должен реагировать длительный асинхронный код на отмену?

Итоги

Итоги: запускайте параллельные задачи одного уровня с помощью async let, запускайте независимую работу через Task {} и реализуйте кооперативную отмену, своевременно выполняя проверки и завершая работу.

Часто задаваемые вопросы

Урок «async let, Task и отмена» бесплатный?

Да — полный текст урока «async let, Task и отмена» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.

Чему я научусь в уроке «async let, Task и отмена»?

Запускайте работу параллельно с помощью async let , создавайте независимые задачи Task и обрабатывайте отмену совместно с вызывающим кодом. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.

Сколько времени занимает урок «async let, Task и отмена»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Структурированный параллелизм и асинхронные функции
  2. async let, Task и отмена
  3. try await и распространение ошибок
← Назад к Swift Academy