В чем разница между асинхронной (async) и параллельной (concurrent) очередью в GCD?

«В чем разница между асинхронной (async) и параллельной (concurrent) очередью в GCD?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Async и Concurrent — это разные аспекты работы с очередями в Grand Central Dispatch (GCD).

Async (Асинхронность)

  • Способ отправки задачи. Задача ставится в очередь и выполняется, не блокируя текущий поток.
  • Не гарантирует параллелизм. Асинхронная задача может выполняться на серийной (serial) очереди, где задачи идут строго по одной.
  • Пример:
    // Отправка задачи асинхронно. Текущий поток продолжает работу.
    DispatchQueue.global().async {
    // Выполнение фоновой задачи
    }

Concurrent (Параллелизм)

  • Тип очереди. Очередь, которая может запускать несколько своих задач одновременно (если есть доступные потоки).
  • Всегда требует async. Задачи на параллельной очереди по умолчанию отправляются асинхронно.
  • Пример:
    // Создание параллельной очереди
    let concurrentQueue = DispatchQueue(label: "com.example.queue", attributes: .concurrent)
    // Задачи на этой очереди могут выполняться параллельно
    concurrentQueue.async { /* Задача A */ }
    concurrentQueue.async { /* Задача B */ }

Ключевое отличие

  • async — это как отправляется задача (не дожидаясь её завершения).
  • concurrent — это свойство очереди, определяющее, могут ли её задачи выполняться параллельно.

Сочетания:

  • serialQueue.async — задачи выполняются по одной, но не блокируют вызывающий поток.
  • concurrentQueue.async — задачи могут выполняться параллельно и не блокируют вызывающий поток.